1.运行时数据区域
1.1 程序计数器
记录当前线程所执行字节码的行号指示器。线程私有,占有很小一块内存,唯一一块没有OutOfMemoryError的区域。
1.2 java虚拟机栈
线程私有,生命周期与线程一样,描述的是Java方法执行的区域:每个方法被执行就回生成一个栈帧(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。
局部变量表存储编译器可知的各种基本数据类型(boolean byte char short int float long double)对象引用(reference)和returnAddress类型,其中float和double占用两个局部变量空间Slot,其余占用一个。
两种异常:线程请求的深度大于虚拟机允许深度,StackOverFlowError,
无法申请到足够的空间:OutOfMemoryError
1.3本地方法栈
与虚拟机栈的作用相同,只不过执行的是本地方法Native,HotSpot把java虚拟机栈和本地方法栈合二为一。
无法申请到足够的空间:OutOfMemoryError unable to cteate new native thread
1.4 java堆(java Heap)
是内存中占用最大的一块,被所有线程共享。所有的对象实例和数组都在这上面分配,但是随着JIT编译器的发展和逃逸技术的成熟等,也不是那么绝对了。
Java堆是内存回收的主要区域,也成为“GC堆”(Garbage Collected Heap)
如果如法申请到足够的空间抛出OutOfMemoryError : Java heap space
1.5 方法区
用来存储虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等。也就是平时大家说的永久代,本质上并不等价,或者说使用永久代实现方法区而已。一般方法区内存回收成绩不令人满意。
如果如法申请到足够的空间抛出OutOfMemoryError :PermGen space
1.6运行时常量池 (Runtime Constant Pool)
是方法区的一部分,Class文件除了有类的版本信息、字段方法接口外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分信息在类加载后存放到方法区的运行时常量池中。
具有动态性,可以使用String类的intern()方法加入。
1.7直接内存
并不是虚拟机运行时数据区的一部分。JDK1.4中引入了NIO类,引入了一种基于通道与缓冲区的I/O方式,可以使用Native直接分配堆外内存,避免了再Java堆和Native堆中来回复制数据。
不会受到Java堆内存限制,但会受到机器总内存的限制。
如果如法申请到足够的空间抛出OutOfMemoryError
2.对象访问
Object obj = new Object();
Object obj 会反映到java栈的本地变量表中,作为一个reference数据类型出现。New Object 会反映到堆中。Reference规定了一个指向对象的访问,主流访问方式有两种:
·句柄访问,java堆中专门开辟出一块句柄池,reference指向句柄池,句柄池中包含了实际的对象地址,优点:reference稳定不用更改。
·直接访问,reference直接指向对象,优点:速度快,Hotspot采用这种方式 。
3.OutOfMemoryError异常
3.1Java堆异常
堆的最小值:-Xms 如-Xms20m
堆的最大值 -Xmx 如果设为一样的则可避免堆自动扩展。
年轻代大小: -Xmn
-XX:+HeapDumpOnOutOfMemoryError 当内存溢出时Dump出当前的内存堆转存快照。
Eclipse中虚拟机参数设置:debug As-->open dubug dialog
生成之后使用Eclipse Memory Analyzer 进行堆转储文件分析(需要安装MAT插件)。
3.2虚拟机栈和本地方法栈溢出
-Xss:设置每条线程的Statck大小.在JDK1.5以后默认是1M,之前是256K
抛出StackOverFlow异常:操作系统分配给每个线程的内存是有限的,机器总内存减去Xmx再减去MaxPermSize,程序计数器占内存很少忽略,剩下的内存被虚拟机栈和本地方法栈瓜分,每个线程分到的栈容量越大,分配的线程数就小。正常情况栈深度1000-2000没问题,如果是建立更多线程导致的内存溢出,在不能减少线程的情况下,只能通过减小Xmx和栈容量来换取更多线程。
3.3方法区和运行时常量池溢出
-PermSize :方法区的初始容量,默认是物理内存的1/64
-MaxPermSize :最大方法区容量。
3.4本机直接内存溢出
-XX:MaxDirectMemorySize 本机直接内存大小,如果不指定,则与Xmx一样
- 大小: 49.3 KB
分享到:
相关推荐
Java内存区域与内存溢出异常.pdf
Java内存区域是Java虚拟机(JVM)管理内存的核心组成部分,它们主要分为以下几个部分: 1. **程序计数器(Program...开发者应当关注内存分配、垃圾收集策略以及对象访问方式,以提高程序效率并避免内存溢出异常。
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...
Java内存区域与内存溢出异常详解 Java内存区域可以分为程序计数器、虚拟机栈、本地方法栈、堆、方法区五个部分。每个部分都有其特定的作用和生命周期。 1. 程序计数器(Program Counter Register):是当前线程所...
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: ...正确理解和运用Java内存机制以及异常处理机制对于开发健壮、高效的Java应用程序至关重要。
Java内存溢出问题,全称为Java OutOfMemoryError,是Java开发者经常遇到的运行时异常。内存溢出通常发生在程序运行过程中,系统无法为运行的应用程序分配足够的内存资源,导致程序无法正常执行。理解并解决Java内存...
Java堆是Java虚拟机中最大的一块内存区域,用于存储对象实例。当程序创建新的对象并分配给堆时,如果堆空间不足,就会抛出`OutOfMemoryError: Java heap space`异常。Java应用程序可以通过设置JVM的启动参数来控制堆...
Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area,Java 8后被元空间取代)以及程序计数器和...
Java内存溢出问题通常指的是Java应用程序在运行过程中由于内存分配不当或使用过度导致JVM无法分配更多的内存,从而抛出`java.lang.OutOfMemoryError`异常。本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. ...
在Java虚拟机(JVM)中,不同的内存区域负责不同的功能,并且各自可能会出现特定类型的内存溢出异常。通过本实验,旨在深入理解JVM内存管理机制以及各种内存区域的特点,并通过具体的编程实践来触发并分析这些异常,...
在 JVM 中,如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出内存溢出异常信息。Heap Size 最大不要超过可用物理内存的 80%,一般的要将 Xmx 和 Xms 设置相同避免每次 GC 后都要调整虚拟机堆的...
#### 一、Java内存区域与内存溢出异常 Java虚拟机(JVM)在运行过程中会管理多种不同的内存区域,这些区域各自承担着特定的任务,并且每种区域都有可能发生内存溢出异常。 ##### 1.1 程序计数器(Program Counter ...
10. **日志和异常处理**:当发生内存溢出时,JVM会生成堆转储文件(hprof),通过分析这些文件可以找出问题原因。同时,良好的异常处理和日志记录可以帮助追踪问题。 11. **监控与调优**:使用JMX(Java Management...
Java编程常见内存溢出异常与代码示例 在Java编程中,内存溢出异常是非常常见的错误之一,了解内存溢出异常的原因和解决方法是非常重要的。本文将详细介绍Java编程中常见的内存溢出异常和代码示例,帮助读者更好地...
不同的内存区域可能出现不同的内存溢出异常,如`OutOfMemoryError`。 1. `java.lang.OutOfMemoryError`: 这是最常见的内存溢出异常,可能由于以下几个原因: - JVM内存设置过小:如果分配给JVM的内存不足,当程序...
#### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)、永久代(Permanent Generation Space)等。不同的内存区域有着不同的作用和特点: ...
每一个Java应用程序启动时都会创建一个独立的Java虚拟机(JVM)实例,每个JVM实例都会有自己的Java堆内存区域。 - **内存分配与回收**:当我们在代码中创建一个新的对象时,JVM会在堆内存中为其分配一块内存。当...
Java内存管理和内存问题,特别是内存泄露与内存溢出,是Java开发者必须面对的重要主题。本文主要探讨了Java内存溢出的检查方法和工具,以及内存泄露的基本原理。 首先,当Java应用程序抛出`java.lang....
Java内存管理是Java虚拟机(JVM)的关键组成部分,它主要负责对象的创建、分配、...总的来说,理解Java内存管理与内存溢出异常对于优化应用性能、防止系统崩溃至关重要。开发者应关注内存使用,确保程序高效且健壮。