java

位置:IT落伍者 >> java >> 浏览文章

关于设置Java虚拟机(JVM)的内存问题


发布日期:2023年01月02日
 
关于设置Java虚拟机(JVM)的内存问题

最近做毕设时遇到了一点小问题在解析dblpxml文件时(该文件很大最新版本为MB)老是报错

javalangOutOfMemoryError: Java heap space

最后通过查资料才知道这是由于JVM堆内存不足造成的JVM在启动动的时候一般会设置JVM Heap的值

其初始空间(即Xms)是物理内存的/最大空间(Xmx)不可超过物理内存在JVM中如果%的时间是用于GC且可用的Heap size 不足%的时候将抛出此异常信息出现这种问题可以通过修改JVM heap大小解决

点击(此处)折叠或打开

java XmsM XmxM className

以上设置JVM初始化堆内存为M最大可用堆内存为M

)在命令行中设置的方法就如上面所述

)在Eclipse中可以这样设置

在eclipse的 Run>Run Configurations>Arguments下的VM Arguments中设置

XmsM XmxM

另外可以使用 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 compilation

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 nonstandard and subject to change without notice

可以通过javalangRuntime的一些方法查看jvm的内存使用情况

点击(此处)折叠或打开

Systemoutprintln(Total Memory: + RuntimegetRuntime()totalMemory() / ( * + MB

Systemoutprintln(Free Memory: + RuntimegetRuntime()freeMemory() / ( * ) + MB

Systemoutprintln(Max Memory: + RuntimegetRuntime()maxMemory() / ( * ) + MB

maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存以字节为单位

totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小也就是java虚拟机这个进程当时所占用的所有内存

freeMemory为当前jvm中没有使用的内存

jvm参数说明 (转自)

server:一定要作为第一个参数在多个CPU时性能佳

Xmsjava Heap初始大小 默认是物理内存的/

Xmxjava heap最大值建议均设为物理内存的一半不可超过物理内存

XX:PermSize:设定内存的永久保存区初始大小缺省值为M(我用visualvmexe查看的)

XX:MaxPermSize:设定内存的永久保存区最大 大小缺省值为M(我用visualvmexe查看的)

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:gclog 指定垃圾收集日志文件

Xmnyoung generation的heap大小一般设置为Xmx的分之一

XX:+UseParNewGC 缩短minor收集的时间

XX:+UseConcMarkSweepGC 缩短major收集的时间 此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适

XX:userParNewGC 可用来设置并行收集【多CPU】

XX:ParallelGCThreads 可用来增加并行度【多CPU】

XX:UseParallelGC 设置后可以使用并行清除收集器【多CPU】

上一篇:Java获取客户端真实IP地址的两种方法

下一篇:Java发送邮件