一.首先給出查詢當前JVM內存的代碼:
下面是查詢當前JVM 內存大小的代碼,可以測試設置后JVM 的內存是否會變化。增加JVM 內存的配置項后,無需重新啟動eclipse 。具體的代碼如下:
1 public class JvmArguments { 2 public static void main(String[] args) { 3 System.out.println("JVM內存信息:"); 4 //最大可用內存,對應-Xmx 5 System.out.println("最大可用內存(對應-Xmx):" + Runtime.getRuntime().maxMemory()/1024/1024 + "Mb"); 6 //當前JVM空閑內存 7 System.out.println("當前JVM空閑內存:" + Runtime.getRuntime().freeMemory()/1024/1024 + "Mb"); 8 //當前JVM占用的內存總數,其值相當於當前JVM已使用的內存及freeMemory()的總和 9 System.out.println("當前JVM占用的內存總數:" + Runtime.getRuntime().totalMemory()/1024/1024 + "Mb"); 10 } 11 }
關於maxMemory(),freeMemory()和totalMemory():
maxMemory()為JVM的最大可用內存,可通過-Xmx設置,默認值為物理內存的1/4,設值不能高於計算機物理內存;
totalMemory()為當前JVM占用的內存總數,其值相當於當前JVM已使用的內存及freeMemory()的總和,會隨着JVM使用內存的增加而增加;
freeMemory()為當前JVM空閑內存,因為JVM只有在需要內存時才占用物理內存使用,所以freeMemory()的值一般情況下都很小,而 JVM實際可用內存並不等於freeMemory(),而應該等於maxMemory()-totalMemory()+freeMemory()
經過個人嘗試,我本機8G的內存,可用內存一般在7.8G左右,如果設置的內存大於等於物理內存的1/4,運行Java程序就會報如下錯誤:
Could not create the java virtual machine
Error occurred during initialization of VM Could not reserve enough space for object heap
所以設置最大可用內存的時候一定要小於物理內存的1/4.
還可以把-Xms和-Xmx對應的數值設置成一樣大小.
二.關於Eclipse中的eclipse.ini文件
附錄我本地Eclipse中的此文件
初學者非常容易混淆eclipse.ini文件的作用,這個文件 是 eclipse 軟件的 配置文件,配置了eclipse 啟動,eclipse是用Java寫的,只不過用的IBM自己的SWT (Standard Widget Toolkit是一個開源的GUI編程框架,與AWT/Swing有相似的用處而已),這里設置的最小內存和最大內存是留給啟動eclipse程序的那個虛擬機使用的(這個文件中關於-Xms 和 -Xmx 的設置的是運行當前Eclipse開發工具的JVM內存分配),我們要修改eclipse中java程序的JVM內存大小這里設置是不起作用的。
如上的設置下運行獲取JVM內存的代碼:
JVM內存信息: 最大可用內存(對應-Xmx):63Mb 當前JVM空閑內存:4Mb 當前JVM占用的內存總數:4Mb
可見eclipse.init中的設置對於Eclipse中的Java代碼是不起作用的.
eclipse.int中-vmargs表示以下為虛擬機設置參數,可修改其中的參數值,也可添加-Xmn,-Xss,另外,eclipse.ini內還可以設置非堆內存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。
此處設置的參數值可以通過以下配置在開發工具的狀態欄顯示:
在eclipse根目錄下創建文件options,文件內容為:org.eclipse.ui/perf/showHeapStatus=true
修改eclipse根目錄下的eclipse.ini文件,在開頭處添加如下內容:
-debug
options
-vm
javaw.exe
重新啟動eclipse,就可以看到下方狀態條多了JVM信息。
附錄截圖:
沒有添加設置之前Eclipse的底部對應的狀態截圖中沒有關於JVM的相關參數:
創建options文件:
修改eclipse.ini文件:
重新啟動Eclipse,有了關於JVM參數的顯示
關於eclipse.ini文件中的一些錯誤配置附錄:
2. Mistake – eclipse.ini The memory settings in eclipse.ini is allocated to Eclipse IDE only, not the program you want to run. A very common mistake is updated the heap size in eclipse.ini, and expects it to solve above out of memory problem. Note The Java application, Ant / Maven build scripts, or unit test cases, are run as an external tool from Eclipse, and it does not inherit the VM settings in eclipse.ini. But, if your Eclipse IDE is always crashed by no reason, you can try to increase the heap size and perm gen in eclipse.ini.
三.通過參數調整JVM參數設置
默認的Java虛擬機的大小比較小,在對大數據進行處理時java就會報錯:java.lang.OutOfMemoryError。
1、JVM內存分配設置:
1. JVM內存分配設置的參數有四個:
-Xmx Java Heap最大值,默認值為物理內存的1/4,最佳設值應該視物理內存大小及計算機內其他內存開銷而定;
-Xms java Heap初始值,Server端JVM最好將-Xms和-Xmx設為相同值,開發測試機JVM可以保留默認值;
-Xmn Java Heap Young區大小,不熟悉最好保留默認值;
-Xss 每個線程的Stack大小,不熟悉最好保留默認值;
2. 如何設置JVM的內存分配:
①命令行運行class文件設置
設置jvm內存的方法,對於單獨的.class,可以用下面的方法對Test運行時的jvm內存進行設置,(只對當前運行的類Test生效)
java -Xms64m -Xmx256m Test
②eclipse中的jdk配置處設置全局
打開eclipse-窗口-首選項-Java-已安裝的JRE(對在當前開發環境中運行的java程序皆生效)
編輯當前使用的JRE,在缺省VM參數中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m
這里的設置影響整個exlipse中的工程的java虛擬機的內存
③針對某個Java文件設置
打開eclipse-運行-運行-Java應用程序(只對所設置的java類生效)
選定需設置內存分配的類-自變量,在VM自變量中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m
注:如果在同一開發環境中同時進行了②jdk設置和③針對某個Java文件設置,則③設置生效,②設置無效,如:
開發環境的設置為:-Xmx256m,而類Test的設置為:-Xmx128m -Xms64m,則運行Test時生效的設置為:-Xmx256m -Xms64m
附錄截圖:
jdk處設置:
RunConfiguration處設置:
運行代碼:
3.當在服務器環境下(如Tomcat)啟動並使用JVM時(對當前服務器環境下所以Java程序生效):
a. 設置環境變量:
變量名:CATALINA_OPTS
變量值:-Xmx128m -Xms64m -Xmn32m -Xss16m
b. 打開Tomcat根目錄下的bin文件夾,編輯catalina.bat,在set JAVA_OPTS=%JAVA_OPTS%....這句之后加上:set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m
c、若沒有catalina.bat,只有tomcat.exe,tomcat6w.exe;則可以在啟動tomcat6w.exe 后 右鍵配置--Java--java option 下面輸入:
-Xmx256m
-Xms64m
也可以找到注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat6\Parameters\JavaOptions
原值為
-Dcatalina.home="C:\ApacheGroup\Tomcat 6.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 6.0\common\endorsed"
-Xrs
加入
-Xms300m
-Xmx350m
重起tomcat服務,設置生效.
附錄一個有價值的帖子:
http://www.mkyong.com/eclipse/eclipse-java-lang-outofmemoryerror-java-heap-space/
.