最近做畢設時
遇到了一點小問題
在解析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 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 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】
XX:UseParallelGC 設置後可以使用並行清除收集器【多CPU】
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26115.html