欢迎来到天天文库
浏览记录
ID:39550236
大小:69.00 KB
页数:10页
时间:2019-07-06
《java虚拟机优化大全》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JVM(Java虚拟机)优化大全和案例实战分类:优化-Tuning2013-03-0622:557950人阅读评论(2)收藏举报JVMJava虚拟机优化案例实战目录(?)[+]1.堆内存设置1.原理1.年轻代2.年老代3.持久代2.参数说明3.疑问解答2.垃圾回收器选择1.串行收集器2.并行收集器吞吐量优先3.并发收集器响应时间优先4.其它垃圾回收参数3.辅助信息参数设置4.关于参数名称等5.JVM服务参数调优实战1.大型网站服务器案例2.内部集成构建服务器案例堆内存设置原理JVM堆内存分为2块:PermanentSpace和HeapSpace。·Permanent即持久代(P
2、ermanentGeneration),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。·Heap={Old+NEW={Eden,from,to}},Old即年老代(OldGeneration),New即年轻代(YoungGeneration)。年老代和年轻代的划分对垃圾收集影响比较大。年轻代所有新生成的对象首先都是放在年轻代。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代一般分3个区,1个Eden区,2个Survivor区(from和to)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个
3、中的一个),当一个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当另一个Survivor区也满了的时候,从前一个Survivor区复制过来的并且此时还存活的对象,将可能被复制到年老代。2个Survivor区是对称的,没有先后关系,所以同一个Survivor区中可能同时存在从Eden区复制过来对象,和从另一个Survivor区复制过来的对象;而复制到年老区的只有从另一个Survivor区过来的对象。而且,因为需要交换的原因,Survivor区至少有一个是空的。特殊的情况下,根据程序需要,Survivor区是可以配置为多个的(多于2个),这样可以增加对
4、象在年轻代中的存在时间,减少被放到年老代的可能。针对年轻代的垃圾回收即YoungGC。年老代在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。针对年老代的垃圾回收即FullGC。持久代用于存放静态类型数据,如JavaClass,Method等。持久代对垃圾回收没有显著影响。但是有些应用可能动态生成或调用一些Class,例如HibernateCGLib等,在这种时候往往需要设置一个比较大的持久代空间来存放这些运行过程中动态增加的类型。所以,当一组对象生成时,内存申请过程如下:1.JVM会试图为相关
5、Java对象在年轻代的Eden区中初始化一块内存区域。2.当Eden区空间足够时,内存申请结束。否则执行下一步。3.JVM试图释放在Eden区中所有不活跃的对象(YoungGC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。4.Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。5.当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(FullGC)。6.FullGC后,若Survivor区及年老代仍然无法存放从Eden区复制过来的
6、对象,则会导致JVM无法在Eden区为新生成的对象申请内存,即出现“OutofMemory”。OOM(“OutofMemory”)异常一般主要有如下2种原因:1.年老代溢出,表现为:java.lang.OutOfMemoryError:Javaheapspace这是最常见的情况,产生的原因可能是:设置的内存参数Xmx过小或程序的内存泄露及使用不当问题。例如循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存。还有的时候虽然不会报内存溢出,却会使系统不间断的垃圾回收,也无法处理其它请求。这种情况下除了检查程序、打印堆内存等方法排查,还可以借助一些内存分析
7、工具,比如MAT就很不错。2.持久代溢出,表现为:java.lang.OutOfMemoryError:PermGenspace通常由于持久代设置过小,动态加载了大量Java类而导致溢出,解决办法唯有将参数-XX:MaxPermSize调大(一般256m能满足绝大多数应用程序需求)。将部分Java类放到容器共享区(例如Tomcatsharelib)去加载的办法也是一个思路,但前提是容器里部署了多个应用,且这些应用有大量的共享类库。参数说明·-Xmx3550m:设置JVM最大堆内存为3550M
此文档下载收益归作者所有