jvm知识梳理1

关于内存分配

1.jvm的内存氛围堆内存和非堆内存,重点来说堆内存。

2.堆内存中有两个地方,一个是年轻代,即young,一个是老年代,即old,这两个区域的大小比例为1:3。

3.在年轻代中又分为三个部分,一个eden(伊甸园)区域,两个survivor(幸存者)区域,s0和s1,它们的大小比例为8:1:1

关于gc

初始化对象的时候,如果一个对象很大,则直接把它放到old区,否则放到eden区,当进行YGC的时候,采用复制算法,把存活的对象放到s0,然后清除eden区域的所有内存,然后再有new的对象,则会放到eden区域,当eden区域要满了的时候,即eden区域无法再为new的对象分配内存的时候,触发YGC,此时会把eden区域存活的对象和s0区域的存活对象全部放到s1区域,此时如果s1区域放不下,那么则直接把它们放到old区域,如此循环往复。那么old区域会越来越大,直到连old区域也没法分配内存了,则进行一次FullGC。下面是摘自其他网友的GC触发条件说明:

  • young GC:当young gen中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。
  • full GC:当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。

猜你喜欢

转载自blog.csdn.net/silk_java/article/details/103677260
今日推荐