java 内存管理机制
垃圾收集算法
1、标记清理算法:效率不高(标记和清理过程效率都不高)、会形成内存碎片
2、复制算法:把内存分为两部分,当进行回收时,把使用部分的存活对象复制到未使用部分,然后两部分内存角色互换(一个为使用的内存,一个为未使用内存。),复制算法一般结合分代收集算法使用。在新生代中使用复制算法进行垃圾收集,内存块按Eden和两个survivor区8:1:1进行分配。当存活对象较多时,效率变低,当存活对象大于%10时需要进行分配担保。当分配担保失败时使用标记清理或标记整理算法进行全部的回收。
3、标记整理算法:标记整理算法,标记部分和标记清理算法相同,整理即将存活的对象向前移动,不会产生内存碎片。
4、分代收集算法:分为新生代和老年代进行垃圾收集,新生代中的对象一般存活的时间短,当对象存活时间较长时移动到老年代中进行保存。
垃圾收集器
(新生代收集器、老年代收集器)
- serial收集器:单线程新生代收集器--复制算法
- parNew收集器:多线程并行新生代收集器--复制算法
- parallel scavenge收集器:多线程新生代收集器,主要目的是可以调节 cpu的吞吐量。
- CMS收集器:老年代收集器,需要配合serial或parNew收集器使用,是基于“标记-清除”算法实现的
- serial old收集器:老年代单线程收集器,基于“标记—整理”实现。
- parallel old收集器:老年代多线程并行收集器“标记-整理”算法实现。
- G1(garbage first:优先收集大区域的垃圾):最新的垃圾收集器,是面向服务端应用的垃圾收集器,可以实现低的中断收集,不需要其他收集器的配合就可以独立的完成整个GC堆,基于“标记-整理”和“复制”算法
复制算法:(Eden和survivor的图解)
当新的对象到来首先看此对象的大小是否达到了参数(-XX:MaxTenuringThreadhold)的设置数,大于直接分配到老年代,小于的话再到新生代的Eden中查看是否有足够空间来保存对象,没有触发minor GC
测试代码:
package com.rhq.test; publicclassTestAllocation{ privatestaticfinalint _1MB=1024*1024; /** * 测试jvm对对象的分配策略 * JVM运行的参数:java堆内存的分配参数设置:-Xms20M(堆大小最小20M) -Xmx20M(堆大小最大20M) * -Xmn10M(新生代大小10M) -XX:+PrintGCDetails -XX:SurvivorRatio=8(Eden和survivor的所占比例为8:1) * 即Eden:8M survivor:1M(两个survivor) */ publicstaticvoid main(String[] args){ // TODO Auto-generated method stub byte[] a1,a2,a3,a4; a1=newbyte[2*_1MB]; a2=newbyte[2*_1MB]; a3=newbyte[2*_1MB]; a4=newbyte[3*_1MB]; } }
运行结果:
[GC [PSYoungGen: 6816K->568K(9216K)] 6816K->6712K(19456K), 0.0038864 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen: 568K->0K(9216K)] [ParOldGen: 6144K->6620K(10240K)] 6712K->6620K(19456K) [PSPermGen: 2515K->2513K(21248K)], 0.0050892 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 9216K, used 3563K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 43% used [0x00000000ff600000,0x00000000ff97af60,0x00000000ffe00000)
from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
to space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
ParOldGen total 10240K, used 6620K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 64% used [0x00000000fec00000,0x00000000ff277208,0x00000000ff600000)
PSPermGen total 21248K, used 2524K [0x00000000f9a00000, 0x00000000faec0000, 0x00000000fec00000)
object space 21248K, 11% used [0x00000000f9a00000,0x00000000f9c77190,0x00000000faec0000)