linux内存与java进程之间的关系
来源:互联网 发布:雅兰 深睡尊享版 知乎 编辑:程序博客网 时间:2024/06/06 20:18
死磕内存篇 --- JAV
运行个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 后观察
1
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、真正的该程序要求的数据空间,是真正在运行中要使用的。
阅读全文
0 0
- linux内存与java进程之间的关系
- Java的Main方法与Java进程之间的关系
- Java的Main方法与Java进程之间的关系
- JAVA进程和linux内存间的大小关系
- 进程、线程与JVM之间的关系
- 进程与线程之间的关系
- 进程与线程之间的关系
- 进程与线程之间的关系
- 做饭与进程线程之间的关系
- 进程与线程之间的关系
- JAVA 线程和进程之间的关系
- Linux内存管理数据结构之间的关系
- 响应操作与内存之间的关系
- 进程与线程之间的关系与区别分析
- java类与类之间的关系
- Java类与类之间的关系
- java与云计算之间的关系
- Java 类与类之间的关系
- 无向图的深度优先搜索
- 数据库中char与varchar类型的区别
- 对对子
- 安卓java时间格式化字母对照
- 浅谈产品功能设计遇到的坑
- linux内存与java进程之间的关系
- js 解析过程
- Keras使用初体验
- 计算机网络实验报告
- 搭建LAMP(Centos7+Apache+MySQL+PHP)环境
- 使用vuejs获取两个数组id,如果某一个数组id成功匹配另一个数组内id,那么就勾选
- sublime插件大全
- java读取XML文件内容的方法
- C#线程传值到主窗体,主窗体控件接收到数据但是显示不出来,请问是什么问题? (回答)