首页 > 代码库 > GC初探

GC初探

一、什么是GC

  GC,是java垃圾回收(Garbage Collection)的简称。

  在C语言中,所有内存都需要程序员去主动申请和释放,十分繁琐。在JAVA中,内存的管理托管给JVM,给编码减轻了不少负担,但与此同时,也带来了GC的困扰。

  对于小的应用,GC动作可能不太引人注意,甚至根本不会被触发;但对于高并发、高吞吐量的程序来说,GC处理不当可能造成灾难性的后果。

  xx

  如图所示,在32core的机器上,1%的GC会带来20%的性能损耗;10%的GC会带来75%的性能损耗!

  由此可见,对GC的一点点改良,可以为系统带来不俗的性能优化。

 

二、GC的工作原理

  

    如图,java堆区内存,由young generation和old generation组成。
    老年区存放长期被使用的堆内存;年轻区存放新分配的堆。如果某个对象,通过年轻区的几次minor gc,都依然存在,
则会被放入老年区。
    年轻区分为Eden和Servivor两个区。Eden是对象被初始创建的地方,如果Eden满了,则触发minor gc——没有被引用的
被释放掉,依然被使用的移到Servivor中。
    Servivor有两个区(用A、B表示),A、B中,总有一个为空。minor gc将幸存的(Servivor)对象放入A,直到某一次minor gc,
A的空间满了。此时A将其中依然幸存的对象移入B中,A清空;其后Eden进行minor gc,新的幸存者也被放入B。
    如此反复,若幸存者经历了15次(可配置)的Servivor区域切换,依然幸存,则被移入到old genneration。
 
三、jvm gc配置
-Xms:启动jvm时的堆内存空间
-Xmx:堆内存最大限制
-XX:NewSize:新生代空间
-XX:MaxNewSize:新生代最大空间
-XX:SurvivorRatio:Eden和Servivor的比例。例如-XX:SurvivorRatio:4,表示两个Servivor和一个Eden的比例为2:4。
 

四、相关工具

1. jstat:查看java进程的统计信息
    查看gc统计信息:jstat -gcutil [pid] {interval}
    S0:survivor0中的使用比率
    S1:survivor1中的使用比率
    E:EDEN的使用比率
    O: old代的使用比率
    P:perm的使用比率
    YGC:young GC次数(总共)
    YGCT:young gc时间(总共)
    FGC: full gc...
    FGCT: full gc...
    GCT:从程序启动到现在gc所耗费的总时间
eg:
    -bash-3.2$ jstat -gcutil 21447 1000
  S0      S1    E         O      P       YGC     YGCT    FGC FGCT  GCT
  0.38 0.00 99.15 76.22 59.30 530278 4514.039 5 6.069 4520.108
  0.00 0.54 62.26 76.22 59.30 530279 4514.056 5 6.069 4520.125
  0.53 0.00 28.25 76.22 59.30 530280 4514.067 5 6.069 4520.136
  0.53 0.00 90.75 76.22 59.30 530280 4514.067 5 6.069 4520.136
  0.00 0.60 54.16 76.22 59.30 530281 4514.080 5 6.069 4520.150
  0.50 0.00 18.39 76.22 59.30 530282 4514.090 5 6.069 4520.159

 

2. jmap:查看某java进程的内存使用情况
    常用命令:jmap -histo [pid]
 
     jmap -dump:format=b,file=test.bin 4939 (用于MAT分析) 
    -dump to dump java heap in hprof binary formt
        :format=b all objects in the heap are dumped.
 
3. Memory Analyzer (MAT)

参考文献:

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html

GC初探