linux和java_java内存和linux关系

运行个JAVA 用sleep去hold住

48304ba5e6f9fe08f3fa1abda7d326ab.png

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();

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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   后观察

继续变换参数   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

修改程序

48304ba5e6f9fe08f3fa1abda7d326ab.png

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();

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

运行 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:

4701deb1de8b1a9d66619203736bc907.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值