文章出處
文章列表
運行個JAVA 用sleep去hold住
package org.hjb.test; public class TestOnly { public static void main(String[] args) { System.out.println("sleep .."); try { Thread.sleep(10000000); } catch (InterruptedException e) { e.printStackTrace(); } } }
java -Xmx10m -Xms10m org/hjb/test/TestOnly
從Jvm進程的角度觀察
查看JAVA進程的總體內存大小
原始參數 java -Xmx10m -Xms10m org/hjb/test/TestOnly 后觀察結果:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27182 root 20 0 1182152 40452 13596 S 0.0 1.0 :00.27 java
變換參數 java -Xmx1024m -Xms1024m org/hjb/test/TestOnly 后觀察
27278 root 20 0 2258424 31656 13776 S 0.0 0.8 0:00.16 java
繼續變換參數 java -Xmx2024m -Xms2024m org/hjb/test/TestOnly 后觀察
27297 root 20 0 3319832 34876 13668 S 0.0 0.9 0:00.10 java
上面觀察可以得出
提高JAVA的堆內存分配,影響的只是VIRT內存的使用情況。 詳附1
實驗二:
觀察JAVA的實際使用內存, JAVA進程的實際使用內存應該包括, JVM的內存+JAVA程序的內存。 詳附2
運行 java -Xmx2048m -Xms2048m org/hjb/test/TestOnly 觀察
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27406 root 20 0 3345308 35000 13716 S 0.0 0.9 0:00.21 java
修改程序
package org.hjb.test; public class TestOnly { public static void main(String[] args) { System.out.println("sleep .."); try { byte[] buf = new byte[1024 * 1024 * 1024]; //1g 增大其內存 Thread.sleep(10000000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
運行 java -Xmx2048m -Xms2048m org/hjb/test/TestOnly 觀察
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27445 root 20 0 3345308 1.034g 13688 S 0.0 26.8 0:00.89 java
上面觀察可以得出
JAVA 程序中實際使用內存才會占用到內存,此時查看JAVA的內存
通過實驗, 設想只有當前用到了內存才會進RES?
后面是通過線上問題發現不是如此, 因為如果沒有釋放的內存,還是在RES的, 比如JDK的沒觸發,那么內存就一直占用 了RES. 所以內存大小還是可以直接影響到JAVA進程的大小
JAVA進程內存 = JVM進程內存+heap內存+ 永久代內存+ 本地方法棧內存+線程棧內存 +堆外內存 +socket 緩沖區內存
linux內存和JAVA堆中的關系
RES = JAVA正在存活的內存對象大小 + 未回收的對象大小 + 其它
VIART= JAVA中申請的內存大小,即 -Xmx -Xms + 其它
其它 = 永久代內存+ 本地方法棧內存+線程棧內存 +堆外內存 +socket 緩沖區內存 +JVM進程內存
附1:
VIRT:virtual memory usage
1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那么它會增長100m,而不是實際的使用量
RES:resident memory usage 常駐內存
1、進程當前使用的內存大小,但不包括swap out
2、包含其他進程的共享
3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
4、關于庫占用內存的情況,它只統計加載的庫文件所占內存大小
SHR:shared memory
1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所占的物理內存大小公式:RES – SHR
4、swap out后,它將會降下來DATA1、數據占用的內存。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程序要求的數據空間,是真正在運行中要使用的。
1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那么它會增長100m,而不是實際的使用量
RES:resident memory usage 常駐內存
1、進程當前使用的內存大小,但不包括swap out
2、包含其他進程的共享
3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
4、關于庫占用內存的情況,它只統計加載的庫文件所占內存大小
SHR:shared memory
1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所占的物理內存大小公式:RES – SHR
4、swap out后,它將會降下來DATA1、數據占用的內存。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程序要求的數據空間,是真正在運行中要使用的。
附2:
文章列表
全站熱搜
留言列表