文章出處

 

運行個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、真正的該程序要求的數據空間,是真正在運行中要使用的。
 
 
附2:
 
 
 
 
 
 
 
 
 
 

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()