关于 "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以后对内存空间进行压缩,整理。