文档章节

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

爱吃大肉包
 爱吃大肉包
发布于 2016/11/24 15:33
字数 892
阅读 41
收藏 1

 

 

运行个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、真正的该程序要求的数据空间,是真正在运行中要使用的。

 

 

附2:

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
爱吃大肉包
粉丝 63
博文 39
码字总数 36109
作品 0
广州
程序员
私信 提问
【死磕Java并发】—– 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。 先来一个总览图: 【高清图,请关注“Java技术驿站”公众号,回复:脑...

chenssy
2018/07/22
0
0
【死磕Sharding-jdbc】— 死磕 Sharding-jdbc 精品合集

死磕 Sharding-jdbc 是 【阿飞哥】的精心力作,花费 4 个月,总共输出 22 篇文章,全部都是关于 Sharding-jdbc 的原理解析和源码分析,通俗易懂。 下图是 【阿飞哥】 的公众号,欢迎各位关注...

飞哥-Javaer
2018/08/26
0
0
LINUX类主机JAVA应用程序占用CPU、内存过高分析手段

转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus)。 做为一个IT运维人员,通常在运维过程中会遇到各种各样的问题,系统问...

丁启良
2015/12/04
0
0
Java执行Runtime.exec(shell)报Cannot allocate memory

在Linux下用java的Runtime.getRuntime().exec(cmd)方式,执行shell脚本时,遇到“Cannot allocate memory”的错误。 网上查询资料整理如下: Cannot allocate memory 在Linux上调试一个比较复...

山哥
2014/06/05
0
0
JAVA虚拟机起步-虚拟机调优

JAVA虚拟机起步OutOfMemory问题解决记录。 问题: JAVA虚拟机报错 # java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space? # # Internal Error......

飓风2000
2014/03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
44
5
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
3
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
9
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部