最近做毕设时 遇到了一点小问题 在解析dblp xml文件时(该文件很大 最新版本为 MB) 老是报错
java lang OutOfMemoryError: Java heap space
最后通过查资料才知道 这是由于JVM堆内存不足造成的 JVM在启动动的时候一般会设置JVM Heap的值
其初始空间(即 Xms)是物理内存的 / 最大空间( Xmx)不可超过物理内存 在JVM中如果 %的时间是用于GC 且可用的Heap size 不足 %的时候将抛出此异常信息 出现这种问题可以通过修改JVM heap大小解决
如
点击(此处)折叠或打开
java Xms M Xmx M className
以上设置JVM初始化堆内存为 M 最大可用堆内存为 M
( )在命令行中设置的方法就如上面所述
( )在Eclipse中可以这样设置
在eclipse的 Run >Run Configurations >Arguments下的VM Arguments中设置
Xms M Xmx M
另外可以使用 java X查看其它JVM参数情况
点击(此处)折叠或打开
D:\work>java X
Xmixed mixed mode execution (default)
Xint interpreted mode execution only
Xbootclasspath:<directories and zip/jar files separated by >
set search path for bootstrap classes and resources
Xbootclasspath/a:<directories and zip/jar files separated by >
append to end of bootstrap class path
Xbootclasspath/p:<directories and zip/jar files separated by >
prepend in front of bootstrap class path
Xnoclassgc disable class garbage collection
Xincgc enable incremental garbage collection
Xloggc:<file>log GC status to a file with time stamps
Xbatch disable background pilation
Xms<size>set initial Java heap size
Xmx<size>set maximum Java heap size
Xss<size>set java thread stack size
Xprof output cpu profiling data
Xfuture enable strictest checks anticipating future default
Xrs reduce use of OS signals by Java/VM (see documentation)
Xcheck:jni perform additional checks for JNI functions
Xshare:off do not attempt to use shared class data
Xshare:auto use shared class data if possible (default)
Xshare:on require using shared class data otherwise fail
The X options are non standard and subject to change without notice
可以通过java lang Runtime的一些方法查看jvm的内存使用情况
点击(此处)折叠或打开
System out println( Total Memory: + Runtime getRuntime() totalMemory() / ( * + MB )
System out println( Free Memory: + Runtime getRuntime() freeMemory() / ( * ) + MB )
System out println( Max Memory: + Runtime getRuntime() maxMemory() / ( * ) + MB )
maxMemory()这个方法返回的是java虚拟机(这个进程)能构从 *** 作系统那里挖到的最大的内存 以字节为单位
totalMemory()这个方法返回的是java虚拟机现在已经从 *** 作系统那里挖过来的内存大小 也就是java虚拟机这个进程当时所占用的所有内存
freeMemory为当前jvm中没有使用的内存
附 jvm参数说明 (转自)
server:一定要作为第一个参数 在多个CPU时性能佳
Xms java Heap初始大小 默认是物理内存的 /
Xmx java heap最大值 建议均设为物理内存的一半 不可超过物理内存
XX:PermSize:设定内存的永久保存区初始大小 缺省值为 M (我用visualvm exe查看的)
XX:MaxPermSize:设定内存的永久保存区最大 大小 缺省值为 M (我用visualvm exe查看的)
XX:SurvivorRatio= :生还者池的大小 默认是 如果垃圾回收变成了瓶颈 您可以尝试定制生成池设置
XX:NewSize: 新生成的池的初始大小 缺省值为 M
XX:MaxNewSize: 新生成的池的最大大小 缺省值为 M
如果 JVM 的堆大小大于 GB 则应该使用值 XX:newSize= m XX:MaxNewSize= m XX:SurvivorRatio= 或者将堆的总大小的 % 到 % 分配给新生成的池 调大新对象区 减少Full GC次数
+XX:AggressiveHeap 会使得 Xms没有意义 这个参数让jvm忽略Xmx参数 疯狂地吃完一个G物理内存 再吃尽一个G的swap
Xss 每个线程的Stack大小 Xss 这使得JBoss每增加一个线程(thread)就会立即消耗 M内存 而最佳值应该是 K 默认值好像是 k
verbose:gc 现实垃圾收集信息
Xloggc:gc log 指定垃圾收集日志文件
Xmn young generation的heap大小 一般设置为Xmx的 分之一
XX:+UseParNewGC 缩短minor收集的时间
XX:+UseConcMarkSweepGC 缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适
XX:userParNewGC 可用来设置并行收集【多CPU】
XX:ParallelGCThreads 可用来增加并行度【多CPU】
lishixinzhi/Article/program/Java/hx/201311/26103ubuntu下java虚拟机内存设置是物理内存容量的1.5到3倍。根据查询相关资料信息显示,ubuntu下java虚拟机内存理设置虚拟内存虚拟内存的设定主要根据你的物理内存大小和电脑的用途来设定,设为物理内存容量的1.5到3倍。如果你的程序是可运行的jar包的话,可以使用:
java -server -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 myJarName.jar
如果是tomcat的话:
修改TOMCAT_HOME/bin/catalina.sh
位置cygwin=false前。
JAVA_OPTS=" -server -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0"
下面是参数说明:
-Xmx5g:设置JVM最大可用内存为5G。
-Xms5g:设置JVM初始内存为5G。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆内存大小 = 年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
-XX:ParallelGCThreads=8:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:SurvivorRatio=6:设置年轻代中Eden区与Survivor区的大小比值。根据经验设置为6,则两个Survivor区与一个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8。
-XX:MaxTenuringThreshold=30: 设置垃圾最大年龄(次数)。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值 设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。设置为30表示 一个对象如果在Survivor空间移动30次还没有被回收就放入年老代。
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试配置这个参数以后,参数-XX:NewRatio=4就失效了,所以,此时年轻代大小最好用-Xmn设置,因此这个参数不建议使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)