Eclipse.ini里面long long time为了让程序运行快点改过堆分配大小,其参数配置的改变只是固定了堆的大小,为此增加了两行:
-Xms512m
-Xmx512m
今天突然想玩玩调优,稍微看来一点资料打算就开干了,我也不喜欢纸上谈兵那种只在没意思,也想把这个过程记录下来和大家分享一下,实现说明一下我对JVM的内存分配方式和GC机制只是稍微有点了解,如果有说错的地方请不要拍砖,请指正,也可以给我发邮件,coffee_hc@163.com我的邮箱。
首先,增加了GC日志,在eclipse.ini后面加上四行:
--XX:+PrintGCTimeStamps //打应垃圾收集的时间情况
--XX:+PrintGCDetails //显示GC的详细信息
--verbose:gc //开启GC日志
--Xloggc:gc.log //日志路径
关闭eclipse所有项目,然后重启
此时在eclipse目录下会出现gc.log这个日志文件,以下是内容:
2.321: [Full GC 2.321: [Tenured: 0K->19557K(349568K), 0.1294009 secs] 95872K->19557K(506816K), [Perm : 16383K->16383K(16384K)], 0.1295350 secs] [Times: user=0.13 sys=0.00, real=0.13 secs]
3.120: [Full GC 3.120: [Tenured: 19557K->23549K(349568K), 0.1181982 secs] 41448K->23549K(506816K), [Perm : 20479K->20479K(20480K)], 0.1183178 secs] [Times: user=0.11 sys=0.00, real=0.12 secs]
3.739: [Full GC 3.739: [Tenured: 23549K->25797K(349568K), 0.1315133 secs] 46185K->25797K(506816K), [Perm : 24575K->24575K(24576K)], 0.1316401 secs] [Times: user=0.14 sys=0.00, real=0.13 secs]
4.362: [Full GC 4.362: [Tenured: 25797K->27900K(349568K), 0.2115846 secs] 44532K->27900K(506816K), [Perm : 28671K->28656K(28672K)], 0.2117293 secs] [Times: user=0.22 sys=0.00, real=0.21 secs]
4.867: [Full GC 4.868: [Tenured: 27900K->29988K(349568K), 0.1893515 secs] 47980K->29988K(506816K), [Perm : 32767K->32767K(32768K)], 0.1894289 secs] [Times: user=0.19 sys=0.00, real=0.19 secs]
6.369: [Full GC 6.369: [Tenured: 29988K->31921K(349568K), 0.2102871 secs] 126978K->31921K(506816K), [Perm : 36863K->36863K(36864K)], 0.2103653 secs] [Times: user=0.22 sys=0.00, real=0.21 secs]
6.888: [Full GC 6.888: [Tenured: 31921K->33672K(349568K), 0.2228748 secs] 51123K->33672K(506816K), [Perm : 40959K->40959K(40960K)], 0.2229558 secs] [Times: user=0.22 sys=0.00, real=0.22 secs]
27.078: [Full GC 27.078: [Tenured: 33672K->34801K(349568K), 0.2983971 secs] 69505K->34801K(506816K), [Perm : 45055K->45046K(45056K)], 0.2984842 secs] [Times: user=0.30 sys=0.00, real=0.30 secs]
首先解释一下这个日志的格式
时间点 [GC开始时间:[动态分配:初始值->分配值(可用值) , 消耗时间 ] 初始值->回收后占用值(可用值),消耗时间]
拿第一行来做例子:
2.321: [Full GC 2.321: [Tenured: 0K->19557K(349568K), 0.1294009 secs] 95872K->19557K(506816K), [Perm : 16383K->16383K(16384K)], 0.1295350 secs] [Times: user=0.13 sys=0.00, real=0.13 secs]
2.321:是时间点,网上没有找到这个具体的定义,但是估计是从系统启动到执行这条GC的时间。
Full GC 2.321 :是指明GC方式,通常将对新生代迚行的回收称为Minor GC;对旧生代迚行的回收称为Major GC,但由于Major GC除并发GC外均需对整个堆以及持久代逆行扫描和回收,因此又称为Full GC。
[Tenured: 0K->19557K(349568K), 0.1294009 secs] 95872K->19557K(506816K):这个是说明了Thnured generation的回收情况,同理如果是“GC”则是针对Young generation的回收,如果是Perm测试持久代的回收。其中0K->19557K(349568K)说明的是旧生代的分配情况,(这里说明一点,GC不仅是负责垃圾回收的,而且也决定内存的分配)我们可以看到旧生代从0k分配到了19557K,可以分配的空间为34956K,然后是分配时间为0.1294009秒,这里是动态分配的信息,紧跟在后面的是回收的信息,前面是回收时间点的Heap实际的使用量,后面是回收之后的Heap使用量。(后面的Perm的信息也和这一样)。
[Times: user=0.13 sys=0.00, real=0.13 secs] :这个说明了我并没有找到相应的说明,但是我的理解是回收过程的时间组成,user表示是该用户使用的时间,sys表示的是系统使用的时间,real就是实际使用时间,应该是user和sys的和。
有了以上的说明我可以开始对这个日志做一下分析:
(在word里面拷贝的这个日志会换行,建议拷贝到编辑器里面查看,方便做对比。)
看看三个红框里面的数据这个是可用值,看看这些值的变化规律,只有持久代的可用值在不断的增大,由此基本可以判断出这几次Full GC是由于重新分配持久代的内存空间造成的(当然造成Full GC的原因不止这一种,我现在也没有都记住,还是在实践中加强记忆来得快)。
既然出现问题就dota(应该是“动它”,解决第一个问题去打盘DOTA)一下好了。
很明显,持久代的空间在启动的额过程中明显不足,那么就增加持久代的空间分配,要为持久代分配空间就必须使用–XX:PermSize–XX:MaxPermSize这个参数,简单计算一下,这次启动完后没有任何动作的情况下持久代的可用空间使用为45056/1024=44M,那么应该设置为多少最好呢,这得从这个代里面存放的内容入手,这个代里面是JVM的方法区,主要是存放一些方法字节码和静态变量,还会放些什么我暂时也不知道,但是应该不会太多,所以我认为持久代的大小应该是相对比较固定大小的波动不会太大的,在整个程序的运行过程中不会有非常大的变化,由于我使用的eclipse是已经装过插件的,以后再扩展插件的几率很小,所以我选择将–XX:PermSize=64M –XX:MaxPermSize=96M,在运行试试看(中间NG了一次结果和没优化一样,原因是-Xx的前面那个中画线貌似不识别,可能是中文输入法的问题,建议在E文输入法中来敲参数,否则设置错误的话失败了都很难找出问题),感觉启动快多了,看看日志:
3.621: [GC 3.621: [DefNew: 139776K->17472K(157248K), 0.0913702 secs] 139776K->20156K(506816K), 0.0915035 secs] [Times: user=0.08 sys=0.00, real=0.09 secs]
8.728: [GC 8.728: [DefNew: 157248K->6813K(157248K), 0.0851032 secs] 159932K->25970K(506816K), 0.0852304 secs] [Times: user=0.08 sys=0.00, real=0.09 secs]
Heap
def new generation total 157248K, used 19646K [0x04b00000, 0x0f5a0000, 0x0f5a0000)
eden space 139776K, 9% used [0x04b00000, 0x05788208, 0x0d380000)
from space 17472K, 38% used [0x0d380000, 0x0da27790, 0x0e490000)
to space 17472K, 0% used [0x0e490000, 0x0e490000, 0x0f5a0000)
tenured generation total 349568K, used 19156K [0x0f5a0000, 0x24b00000, 0x24b00000)
the space 349568K, 5% used [0x0f5a0000, 0x108553c8, 0x10855400, 0x24b00000)
compacting perm gen total 65536K, used 40825K [0x24b00000, 0x28b00000, 0x2ab00000)
the space 65536K, 62% used [0x24b00000, 0x272de638, 0x272de800, 0x28b00000)
No shared spaces configured.
哈哈,已经不再有Full GC,第一步优化成功启动速度减少了19秒,相当可观,去dota一把了,明天看看还能怎么继续优化。
--2011.4.28
分享到:
相关推荐
你对Eclipse中JVM内存设置方法是否熟悉,这里通过几个问题向大家解释一下,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JRE。
设置Eclipse的JVM参数
eclipse与tomcat的JVM设置
在eclipse设置JVM heap 的最小值与最大值的图案
JVM优化方法
Java助力需要jvm学习及优化与性能瓶颈分析参考
jvm参数优化后,tomcat稳定可靠,附件为通过长时间在线测试的配置参数文件
当前,以Hadoop、Spark为...这些大数据处理框架采用分布式架构,使用Java、Scala等面向对象语言编写,在集群节点上以Java虚拟机(JVM)为运行时环境执行计算任务,因此依赖JVM的自动内存管理机制来分配和回收数据对象.
首先讲述JVM的基本概念和原理、架构等。最后一HelloApp讲述JVM的工作过程
解决jvm terminated Exit code=-1的问题,无需重装Java虚拟机或eclipse
淘宝JVM优化实践-长仁.pdf
jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识...
- 了解下我们为什么要学习JVM优化 - 掌握jvm的运行参数以及参数的设置 - 掌握jvm的内存模型(堆内存) - 掌握jamp命令的使用以及通过MAT工具进行分析 - 掌握定位分析内存溢出的方法 - 掌握jstack命令的使用 - 掌握...
JVM优化及面试热点分析
JVM性能优化笔记 ------------------------------------------
运行eclipse提示JVM错误的解决方法
在课程内容上几乎不用过多的介绍,单是查阅目录就会发现非常的强悍,课程从思路和实际案例的角度出发,非常全面的像同学们诠释了JVM与GC调优的思路和策略,对实际企业级应用是有巨大的提升价值。 〖课程目录〗: (1)\...
对于使用eclipse卡或者在启动项目,空间分配不足导致慢等问题。
1 什么是性能优化\ 2 性能测试与优化\ 3 性能优化JVM篇\ 4 性能优化Tomcat篇\ 5 性能优化mysql篇\
标签:ant-eclipse-jvm1.2-1.0.jar.zip,ant,eclipse,jvm1.2,1.0,jar.zip包下载,依赖包