JVM的分代垃圾收集算法及OOM

Java 内存类型分为:
Heap
Permanent
Stack
其中Heap
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
Heap分为:
a.新生代(young generation):新生代又被分为两块: Eden Space和Survivor spaces新建的大部分对象存放在Eden Space
b.旧生代(tenured generation又成old):存放新生代中经过多次垃圾回收仍然存活的对象,新建对象也
有可能存在,像大的数组对象,且成员中无引用外部对象
[Eden  ['i:dn]  n. 伊甸园, 乐园,tenured  ['tenjuə]终身占用 ]

其中的Permanent Generation (non-heap)
保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。JVM共享这些类数据。
这个区域被分割为只读的和只写的,
另外
Code Cache (non-heap)
HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)分区
OOM内存溢出:
如果JVM里运行的程序, 它的heap space和perm gen都满了,这个时候程序还企图创建新的对象实例的话,jvm gc就会启动,试图释放足够的内存来创建这个对象。这个时候如果gc无法释放出足够的内存,它就会抛出OutOfMemoryError内存溢出错误。
垃圾收集类型:
MinorGC局部垃圾收集(新生代垃圾收集)
FullGC全局垃圾收集 对新生代、旧生代及持久代都进行GC,此时JVM停止对外相应,CPU占用率变高。
FullGC原因:
1、旧生代空间不足触发Full GC
2、CMS GC失败触发的Full GC
3、统计得到的MinorGC晋升到旧生代的平均大小 大于旧生代的剩余空间
CMS:Concurrent Mark-Sweep GC(执行时间和应用并发进行),参数:-XX:+UseConcMarkSweepGC
注:CMS执行过程大部分时候是和应用并发进行,相比并行GC,CMS GC需要执行三次mark,GC总耗时较长,但执行GC的时间被缩短

你可能感兴趣的:(jvm,算法,cms,虚拟机,cache)