linux和java_java内存和linux关系
運(yùn)行個(gè)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進(jìn)程的角度觀察
查看JAVA進(jìn)程的總體內(nèi)存大小
原始參數(shù) ? ? ? ? java -Xmx10m -Xms10m org/hjb/test/TestOnly ??后觀察結(jié)果:
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
變換參數(shù) ? ? ? ? ?java -Xmx1024m -Xms1024m org/hjb/test/TestOnly ? 后觀察
繼續(xù)變換參數(shù) ??java -Xmx2024m -Xms2024m org/hjb/test/TestOnly ? 后觀察
27297 root 20 0 3319832 34876 13668 S 0.0 0.9 0:00.10 java
上面觀察可以得出
提高JAVA的堆內(nèi)存分配,影響的只是VIRT內(nèi)存的使用情況。?詳附1
實(shí)驗(yàn)二:
觀察JAVA的實(shí)際使用內(nèi)存, ?JAVA進(jìn)程的實(shí)際使用內(nèi)存應(yīng)該包括, JVM的內(nèi)存+JAVA程序的內(nèi)存。?詳附2
運(yùn)行 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 增大其內(nèi)存
Thread.sleep(10000000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
運(yùn)行 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 程序中實(shí)際使用內(nèi)存才會(huì)占用到內(nèi)存,此時(shí)查看JAVA的內(nèi)存
通過實(shí)驗(yàn),設(shè)想只有當(dāng)前用到了內(nèi)存才會(huì)進(jìn)RES?
后面是通過線上問題發(fā)現(xiàn)不是如此, 因?yàn)槿绻麤]有釋放的內(nèi)存,還是在RES的, 比如JDK的沒觸發(fā),那么內(nèi)存就一直占用 了RES. ?所以內(nèi)存大小還是可以直接影響到JAVA進(jìn)程的大小
JAVA進(jìn)程內(nèi)存 = JVM進(jìn)程內(nèi)存+heap內(nèi)存+ 永久代內(nèi)存+ 本地方法棧內(nèi)存+線程棧內(nèi)存?+堆外內(nèi)存 +socket 緩沖區(qū)內(nèi)存
linux內(nèi)存和JAVA堆中的關(guān)系
RES = JAVA正在存活的內(nèi)存對(duì)象大小 + 未回收的對(duì)象大小 ?+ 其它
VIART= JAVA中申請(qǐng)的內(nèi)存大小,即 -Xmx ?-Xms + 其它
其它 =?永久代內(nèi)存+ 本地方法棧內(nèi)存+線程棧內(nèi)存?+堆外內(nèi)存 +socket 緩沖區(qū)內(nèi)存 +JVM進(jìn)程內(nèi)存
附1:
VIRT:virtual memory usage
1、進(jìn)程“需要的”虛擬內(nèi)存大小,包括進(jìn)程使用的庫、代碼、數(shù)據(jù)等
2、假如進(jìn)程申請(qǐng)100m的內(nèi)存,但實(shí)際只使用了10m,那么它會(huì)增長100m,而不是實(shí)際的使用量
RES:resident memory usage 常駐內(nèi)存
1、進(jìn)程當(dāng)前使用的內(nèi)存大小,但不包括swap out
2、包含其他進(jìn)程的共享
3、如果申請(qǐng)100m的內(nèi)存,實(shí)際使用10m,它只增長10m,與VIRT相反
4、關(guān)于庫占用內(nèi)存的情況,它只統(tǒng)計(jì)加載的庫文件所占內(nèi)存大小
SHR:shared memory
1、除了自身進(jìn)程的共享內(nèi)存,也包括其他進(jìn)程的共享內(nèi)存
2、雖然進(jìn)程只使用了幾個(gè)共享庫的函數(shù),但它包含了整個(gè)共享庫的大小
3、計(jì)算某個(gè)進(jìn)程所占的物理內(nèi)存大小公式:RES – SHR
4、swap out后,它將會(huì)降下來DATA1、數(shù)據(jù)占用的內(nèi)存。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程序要求的數(shù)據(jù)空間,是真正在運(yùn)行中要使用的。
附2:
總結(jié)
以上是生活随笔為你收集整理的linux和java_java内存和linux关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ltpa_LTPA Cooki
- 下一篇: java hashtable排序_jav