最近系统偶尔抛出错误:
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
于是简单研究了一下内存的配置。
-XX:PermSize=64m -XX:MaxPermSize=64m
这个是非堆内存配置,初始与最大。64兆系统启动没有问题,如果设置为32兆,则会报错:
java.lang.OutOfMemoryError: PermGen space,并且系统启动失败。
-XX:PermSize=64m -XX:MaxPermSize=32m
不要以为最大设为32就可以控制非堆为32兆,实践证明这样还是以64兆初始的,启动成功。
非堆主要用于反射等,所以不用太大,够用就行。
-Xms128m -Xmx128m
这个是堆,也就是heap。要设置大一些。一般初始和最大设为一样,减少变化时的开销。
如果设置过小,比如32m,也是可以启动成功,也可以访问页面,但是会输出日志:
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor3]
有generation机制。heap分为young和old。
-Xmn是控制young的。一般分配四分之一。
-Xmn32m
所以,很自然的,Xmx-Xmn就是old。当jvm有一个线程,会在不足时把young升级为old的。
网上说Xmx不要超过物理内存,否则会报错:
“Error occurred during initialization of VM Could not reserve enough space for object heap”
也就是说本文第一句的系统报错不是别的应用占用了内存导致,而是本身分配给应用的内存不够导致。
系统组跟我说杀掉其他应用就解决了这个说法是错误的。
同时,网上说web应用的heap值可以比gui的大。也就是说heap与吞吐量有关。
可以增加日志观察GC的情况:
-XX:+PrintGCDetails -Xloggc:d:\gc.log
+号是开,-号是关。
看gc.log文件:
3.784: [GC 3.784: [DefNew: 26240K->3264K(29504K), 0.0409710 secs] 26240K->3677K(521024K), 0.0411614 secs] [Times: user=0.05 sys=0.00, real=0.05 secs]
15.576: [Full GC 15.576: [Tenured: 0K->12588K(349568K), 0.3585221 secs] 70393K->12588K(506816K), [Perm : 36863K->36863K(36864K)], 0.3587096 secs] [Times: user=0.31 sys=0.03, real=0.36 secs]
DefNew是young,Tenured是old。
young里存活久的对象会自动移到old。old里回收并不频繁。
同样一个操作,如果Xms过小,jvm需要频繁的回收对象,log日志就会很多;
相反,Xms设置大,log日志会少很多。
如果PermSize设置大,DefNew会多,Tenured少。比如
-XX:PermSize=64m -XX:MaxPermSize=64m
基本没有Tenured。
Minor收集young,Major收集old,
-XX:+UseParNewGC调节Minor,-XX:+UseConcMarkSweepGC调节Major,没时间尝试,先不管。
解决方案:
1 增加gc.log日志
2 调大Xms和Xmx为4G试试,现在是2G
============
2013.7.19
增加一种方案:增加选项:-XX:-UseGCOverheadLimit
if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown.
分享到:
相关推荐
关于JAVA内存泄漏问题注意事项.doc
主要关于java虚拟机的运行时数据区域,参考了周志明的深入理解java虚拟机,还涉及到了native方法、垃圾回收机制等等。
关于java内存的小常识,以helloworld程序为例。小白新学java,作为自己的笔记留存。可能有错误的地方还希望大佬们指出来。
如何管理内存,及内存泄漏。Java的内存管理就是对象的分配和释放问题。监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。
什么是内存泄漏?造成内存泄漏的原因?如何解决内存泄漏?以及如何避免内存泄漏等。。。
几点Java问题,是电子书籍,讲解了Java的内存的问题
java 内存模型 java 内存模型 java 内存模型 java 内存模型
自己总结的一些关于java内存益出的东西
java内存泄漏解决java内存泄漏解决java内存泄漏解决
描述java内存回收机制,异常出现原因,解决方案
JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控 JAVA内存监控
如何解决Java内存泄漏
java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存解析(讲的很清楚的视频)java内存...
Java内存泄露及内存无法回收解决方案,深入讲解相关原理及相关过程。
jProfiler7 java内存分析 linux版本
关于java内存分配的讲述。JAVA 文件编译执行与虚拟机(JVM)介绍
深入理解 java 内存模型是 java 程序员的必修课,看看原汁原味正宗的内存模型吧
java内存泄露、溢出检查方法和工具。 步骤: 1,使用linux命令生存堆栈文件 2,用MemoryAnalyzer.exe工具打开 3,根据工具生成的饼状图可以清晰的找出内存泄漏源
java内存详解java内存详解java内存详解java内存详解
Java内存监控工具Java VisualVM