在前幾篇中有基本概述如下
1 java 應用程式設置最大堆內存與最小堆內存
1.1 最大堆內存
java應用程式可以使用最大堆內存可以用-Xmx參數指定,最大堆內存指的是新生代和老年代的大小之和的最大值,是java應用程式的堆上限
在java程序運行時可以通過 Runtime.getRuntime().maxMemory()取得系統的可用的最大堆內存
1.2 最小堆空間
使用 -Xms可用於設置系統的最小堆空間,也就是jvm啟動時所佔據的作業系統的內存大小,java應用程式在運行時,首先會被分配-Xms指定的內存大小,並儘可能的在這個空間段內存中運行程序,當這個值無法滿足應用程式時,jvm才會向作業系統中申請更多的內存,直到內存值達到-Xmx指定的大小,若超過-Xmx指定的大小時,則拋出 OutOfMemoryError異常
如果 -Xms的數值較小,那麼JVM為了保證系統儘可能的在指定內存範圍中運行,就會更加頻繁地進行GC操作,以釋放內存空間
因此 把-Xms的值設置為-Xmx時,可以在系統運行初期時減少CG的次數和耗時
2 java 應用程式設置新生代內存與持久代內存
2.1 新生代內存
參數-Xmn用於設置新生代的大小,設置一個較大的新生代會減少老年代的大小,對系統性能以及GC有很大的影響,新生代的大小一般設置為整個堆空間的1/4到 1/3左右
在Hot Spot虛擬機中,-XX:NewSize用於設置新生代的初始大小,-XX:MaxNewSize設置新生代的最大值,通常情況下,設置-Xmn的效果等同於設置了想用 的-XX:NewSize 和-XX:MaxNewSize,若設置不用的XX:NewSize 和-XX:MaxNewSize,可能會導致內存震蕩,從而產生不必要的系統開銷
2.1 持久代內存(方法區)
參數 -XX:MaxPermSize可以設置持久代的最大值,-XX:PermSize可以設置持久代的初始大小
系統所支持的最大類數量,與MaxPermSize成正比,一般設置為64M可以滿足絕大部分程序的正常工作,如果不夠可以設置為 128M,這是兩個比較常用的永久區取值
3 java 應用程式設置線程棧內存
參數 -Xss 參數用來設置線程棧(針對每一個線程)的大小
在線程進行局部變量分配,函數調用時,都需要在棧中開闢空間,如果棧的空間開闢太小,那麼線程在運行時,就可能沒有足夠的空間分配局部變量或者達不到足夠的函數調用深度,導致程序異常退出,如果棧的空間開闢太大,那麼開設線程所需的內存成本就會上升,系統所支持的線程數就會下降
從堆內存角度來考慮,堆也是向作業系統申請內存空間的,因此堆空間過大,就會導致作業系統可用於線程棧的內存減少,從而間接減少程序所能支持的線程數量
下面是若干次測試
Java堆內存以 900M的大小遞增,當棧大小為1M時,最大線程數量以200遞減。
當系統的內存空間不足而無法創建新的線程時,會拋出 java.lang.OutOfMemoryError:unable to create new native thread