最近,因为项目须要,要在一个Tomcat上部署多个Web应用。考虑到Tomcat的最大堆大小为128MB,因此我对Tomcat的JVM参数作如下调整,并输出GC日志。参数以下linux
1 |
-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M -Xloggc:D:/TomcatGc.log |
然而在应用启动完成以后,在控制台不断输出如下“奇怪信息”算法
1 |
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor339] |
2 |
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor336] |
3 |
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor341] |
4 |
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor342] |
5 |
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor340] |
查看输出的GC日志,发现JVM从394.237S到2040.453s之间都在频繁地进行FullGC数组
要知道JVM频繁地进行FullGC确定不是什么好事情。因而就经过Google去搜索是什么缘由致使那些“奇怪信息”的输出。框架
网上有许多回答都说是因为堆空间不够,JVM正尝试回收一些无用的对象。我在StackOverFlow上也发起相关的提问,给的回答也是这个 。因此就信觉得真,开始加大堆大小,调整参数以下:spa
1 |
-Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=512M -Xloggc:D:/TomcatGc.log |
在应用启动完成以后,一开始并无当即出现那些“奇怪信息”。可是在大约过了10分钟左右。控制台又不断输出上述“奇怪信息”。.net
通过一番折腾以后,我终于否决了堆空间不够致使那些”奇怪信息“输出的回答了,这哪里是这个缘由致使的,简直就是坑爹。hibernate
那究竟是什么缘由致使的呢?回想起本身之前学过的JVM的知识。JVM运行时数据区域有分为方法区和堆。方法区(也叫永久代)用于存储类型信息、常量和静态变量等。堆空间用于存储对象和数组等。根据GC算法,堆空间又分为新生代和老年代。在新生代中会触发MinorGC(也称GC),老年代会触发MajorGC(也称Full GC).关于更多的信息能够参考我以前的文章代理
然而不少人都忽略了方法区也能够存在GC操做。此次悲剧的产生也是因为本身开始忽略这点致使的。要知道方法区的GC主要回收两部份内容:废弃常量和无用的类(注意这里的类和对象是两个不一样的概念)。日志
判断一个类是不是无用的类须要知足下面3个条件:
1.该类全部的实例都已经被回收,也就是Java堆中不存在该类的任何实例
2.加载该类的ClassLoader已经被回收
3.该类对应的Java.lang.Class对象没有在任何地方被引用,没法在任何地方经过反射访问该类的方法code
JVM能够对知足上述3个条件的无用类进行回收,这里说的仅仅是“能够”,而不是和对象同样,不使用了就必然会回收。是否对类进行回收,JVM提供了-Xnoclassgc参数进行控制。因而,我在Tomcat的Jvm参数里加上 -Xnoclassgc并限制 -XX:PermSize=128M -XX:MaxPermSize=128M.从新启动Tomcat后,上述“奇怪信息”就不在出现了,并抛出了OutOfMemory PermGen space 异常。关于 OutOfMemory PermGen space 异常。这里也有一个很是有趣的讨论,你们能够看下。
总结:
在大量使用发射、动态代理、cglib等框架好比Spring、hibernate等,都须要虚拟机具有类卸载的功能,以保证方法区不会溢出。若是限制类卸载功能及限制 PermSize大小,相信方法区很快就会溢出。因此那些“奇怪信息”也属于正常的输出。另外也能够经过调大 PermSize的值已保证有足够的空间来装载这些类信息,这样,“奇怪信息”就可能不会输出了。
1.区分JVM的中永久代、新生代和老年代的概念。记住Full GC和GC都发生在堆中。
2.致使频繁的Full GC的缘由是堆空间大小不够,可是奇怪的信息输出毫不是堆空间不足产生。
3.折腾一天算是浪费时间,可是从中也学到和巩固很多知识也算是塞翁失马。