现在的位置: 首页 > 综合 > 正文

JVM性能调优总结(持续更新中)

2017年12月27日 ⁄ 综合 ⁄ 共 1072字 ⁄ 字号 评论关闭

关于 "Unloading class sun.reflect.GeneratedSerial...

总结:

    在大量使用发射、动态代理、cglib等框架比如Spring、hibernate等,都需要虚拟机具备类卸载的功能,以保证方法区不会溢出。如果限制类卸载功能及限制 PermSize大小,相信方法区很快就会溢出。所以那些“奇怪信息”也属于正常的输出。另外也可以通过调大 PermSize的值已保证有足够的空间来装载这些类信息,这样,“奇怪信息”就可能不会输出了。

1.区分JVM的中永久代、新生代和老年代的概念。记住Full GC和GC都发生在堆中。

2.导致频繁的Full GC的原因是堆空间大小不够,但是奇怪的信息输出绝不是堆空间不足产生。

3.折腾一天算是浪费时间,但是从中也学到和巩固不少知识也算是因祸得福。


小结:

这篇文章是处理XX:PermSize(持续带的初始值)和XX:MaxPermSize(持续带的最大值)

关于初始值的计算规则:找到项目的lib文件夹,查看文件夹中lib的大小,跟64(m)比较,举个例子,我的项目lib中的jar包是144m,比64*2大,那么在64*2的基础上还要在加上一个64即:64*2+64
= 192m,最大值在此基础上在加一个64即:192+64=256m;

--------------------------------------------------------------------------------------------------------------



内存碎片清理(一次jvm性能调优的过程)

1、 -XX:CMSInitiatingOccupancyFraction=30 
预留足够的空间给young gc,防止从young gc 过来一个较大的内存块,而年老代无足够预留空间,无法提供内存快用于回收后的分配,引起强制的full gc,造成较长时间的线程中断 
2、-XX:+UseCMSCompactAtFullCollection 
设置在FULL GC的时候, 对年老代的压缩;CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片 
3、 -XX:CMSFullGCsBeforeCompaction=1 
设置多少次full gc后进行内存压缩,由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理。

抱歉!评论已关闭.