首页 > 代码库 > GC初探
GC初探
一、什么是GC
GC,是java垃圾回收(Garbage Collection)的简称。
在C语言中,所有内存都需要程序员去主动申请和释放,十分繁琐。在JAVA中,内存的管理托管给JVM,给编码减轻了不少负担,但与此同时,也带来了GC的困扰。
对于小的应用,GC动作可能不太引人注意,甚至根本不会被触发;但对于高并发、高吞吐量的程序来说,GC处理不当可能造成灾难性的后果。
如图所示,在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初探
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。