JVM内存模型及内存分配过程
2013-10-11 20:10
239 查看
一、JVM内存模型
JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域)。
1、Heap是运行时数据区域,所有类实例和数组的内存均从此处分配。Heap区分两大块,一块是 Young Generation,另一块是Old Generation:
1)在Young Generation中,有一个叫Eden Space的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to),它们的大小总是一样,它们用来存放每次垃圾回收后存活下来的对象。
2)在Old Generation中,主要存放应用程序中生命周期长的内存对象。
2、Permanent区:
Permanent Generation,主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本不参与垃圾回收。Permanent generation 不是Heap的一部。
.
二、内存大小
1、Heap内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;
JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM 就会增大堆直到-Xmx 的最大限制,可以由 -XX:MinHeapFreeRatio 指定。
默认空余堆内存大于70%时,JVM 会减少堆直到-Xms的最小限制,可以由 -XX:MaxHeapFreeRatio 指定,
2、Permanent区域内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
三、JVM内存分配过程
1、JVM 会试图为相关Java对象在Eden中初始化一块内存区域。
2、当Eden空间足够时,内存申请结束;否则到下一步。
3、JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收)。释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
4、Survivor区被用来作为Eden及Old的中间交换区域,当Old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区。
5、当Old区空间不够时,JVM 会在Old区进行完全的垃圾收集(0级)。
6、完全垃圾收集后,若Survivor及Old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory”错误。
参考:
Java 内存模型及GC原理
java内存模型及GC原理 和
图解JVM在内存中申请对象及垃圾回收流程
JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域)。
1、Heap是运行时数据区域,所有类实例和数组的内存均从此处分配。Heap区分两大块,一块是 Young Generation,另一块是Old Generation:
1)在Young Generation中,有一个叫Eden Space的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to),它们的大小总是一样,它们用来存放每次垃圾回收后存活下来的对象。
2)在Old Generation中,主要存放应用程序中生命周期长的内存对象。
2、Permanent区:
Permanent Generation,主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本不参与垃圾回收。Permanent generation 不是Heap的一部。
.
二、内存大小
1、Heap内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;
JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM 就会增大堆直到-Xmx 的最大限制,可以由 -XX:MinHeapFreeRatio 指定。
默认空余堆内存大于70%时,JVM 会减少堆直到-Xms的最小限制,可以由 -XX:MaxHeapFreeRatio 指定,
2、Permanent区域内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
三、JVM内存分配过程
1、JVM 会试图为相关Java对象在Eden中初始化一块内存区域。
2、当Eden空间足够时,内存申请结束;否则到下一步。
3、JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收)。释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
4、Survivor区被用来作为Eden及Old的中间交换区域,当Old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区。
5、当Old区空间不够时,JVM 会在Old区进行完全的垃圾收集(0级)。
6、完全垃圾收集后,若Survivor及Old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory”错误。
参考:
Java 内存模型及GC原理
java内存模型及GC原理 和
图解JVM在内存中申请对象及垃圾回收流程
相关文章推荐
- JVM内存模型及内存分配过程
- JVM内存模型及内存分配过程
- JVM内存模型及内存分配过程
- JVM内存模型及内存分配过程
- JVM内存模型及内存分配过程
- jvm内存模型和内存分配
- jvm内存模型及分配参数
- JVM中的内存分配及GC回收过程简单整理
- jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
- 深入JVM系列(一)之内存模型与内存分配
- 深入JVM系列(一)之内存模型与内存分配
- 深入JVM系列(一)之内存模型与内存分配
- 窥探JVM内存分配和回收的过程
- 基本的JVM内存分配过程案例
- JVM 内存分配模型概念和java中各种对象的存储
- jvm内存模型及分配
- [JAVA修炼之路四]-JVM内存模型以及对象实例化过程
- 【Java高级】JVM内存区域模型和加载过程
- 深入JVM系列之内存模型与内存分配及 AndroidGC原理
- jvm内存模型和内存分配