熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

設置Java虛擬機(JVM)的內存問題

2013-11-23 19:00:00  來源: Java核心技術 
    最近做畢設時遇到了一點小問題在解析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時性能佳
   
    Xms:java Heap初始大小 默認是物理內存的/
   
    Xmx:java 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 指定垃圾收集日志文件
   
    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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.