Java GC 简要分析

来源:互联网 发布:苹果6移动网络快捷键 编辑:程序博客网 时间:2024/04/28 05:52

一:java GC原理

    java虚拟机启动之初,内存分配如下图所示,由分为三个部分young新生代、Tenrued永久生代和perm组成。新生代主要是生成对象,永久生代是用来保存那些程序运行过程一直被引用的一些对象,permanent generation是用来保存一些特殊对象,比如类和方法存储的地方等等。 
  运行过程中大多数的对象是有young generation(新生代)来生成,并且大多对象也在哪里死亡然后被垃圾回收。young新生代又分为 eden 和两个survivor spaces。大部分的对象是eden来生成。两个survivor spaces其中的一个幸存空间永远是空的,用来保存垃圾收集后幸存对象和另一个幸存空间的对象。 当新生代满了以后 minor collection就启动,收集对象进行垃圾回收,此时会有一些幸存下来的对象(仍旧被引用)这些对象会被转移到tenured generation(持久生代)。 但是当tenured generation也满了的时候,就会触发major collection此时整个heap内的对象都会被收集然后进行垃圾回收(即full gc)。图中还有一些标志为Virtual地方,实际是指 内存在运行中对象占用内存不多,有些空间还没有被实际分配物理地址,但是随着对象占用的空间越来越大时,这些Virtual空间随时就会被占用。这跟启动java虚拟机时分配的最小地址有关,比如 启动时 -xms 为600M  而-xmx 为2048M则刚开始只有600M的空间是分配了,剩下的还有很多是虚拟空间等待被使用。

space usage by generations

       

二:gc日志分析
1.当启动时增加 -verbose:gc 参数后gc日志会如下所示
[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]
如上所示,包含了两次minor collection 和一次major collection,例如325407K和83000K是指经过一次minor垃圾收集后所有活着对象所占的空间,这些对象包括所以在永久生代或者被永久生代引用或者被permanent 引用的对象,即内存中所有的活着的对象。而括号中的数是指所有被物理分配空间的大小,即除去virtual大小的空间,官方文档称为committed space。后面的时间是垃圾回收耗费的时间。下面的Full Gc也是类似。

2.如果启动时增加 -XX:+PrintGCDetails 这个参数则gc日志如下所示
  [GC [PSYoungGen: 671728K->4848K(674304K)] 747836K->84256K(2039680K), 0.0230930 secs] 
 PSYoungGen 是垃圾收集器的类型,671728K->4848K,是新生代在垃圾回收前后的内存占用,(674304K)是新生代committed的内存大小。747836K->84256K(2039680K)是Heap总量回收前后内存使用情况,(2039680K)是Heap总量commit值占用情况,0.0230930 secs是gc耗费时间。

即:

[GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]

<collector>                     GC收集器的名称<starting occupancy1>    新生代在GC前占用的内存<ending occupancy1>     新生代在GC后占用的内存<pause time1>                 新生代局部收集时jvm暂停处理的时间<starting occupancy3>    JVM Heap 在GC前占用的内存<ending occupancy3>     JVM Heap 在GC后占用的内存 <pause time3>                GC过程中jvm暂停处理的总时间


原创粉丝点击