好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

死磕内存篇 --- JAVA进程和linux内存间的大小关系

(adsbygoogle=window.adsbygoogle||[]).push({})

-->

(adsbygoogle=window.adsbygoogle||[]).push({})

运行个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
root S 0.0 1.0 :00.27 java

 

变换参数          java -Xmx 1024 m -Xms 1024 m org/hjb/test/TestOnly   后观察

 

27278   root   20  0     2258424      31656    13776 S     0.0       0.8       0:00.16     java

  

 

继续变换参数   java -Xmx 2024 m -Xms 2024 m org/hjb/test/TestOnly   后观察

 

  root                     S    0.0       0.9       :00.10     java   

上面观察可以得出

 

 

实验二:

 

运行 java -Xmx2048m -Xms2048m org/hjb/test/TestOnly  观察

 

 PID    USER   PR    NI     VIRT          RES        SHR     S    %CPU  %MEM      TIME+  COMMAND
root S 0.0 0.9 :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
root .034g S 0.0 26.8 :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:

 

 

 

 

 

 

 

 

 

 

(adsbygoogle=window.adsbygoogle||[]).push({})

-->

(adsbygoogle=window.adsbygoogle||[]).push({})

查看更多关于死磕内存篇 --- JAVA进程和linux内存间的大小关系的详细内容...

  阅读:41次