运行个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 -Xmx1024m -Xms1024m org/hjb/test/TestOnly   后观察
 
27278   root   20  0     2258424      31656    13776 S     0.0       0.8       0:00.16     java

  

 
继续变换参数   java -Xmx2024m -Xms2024m org/hjb/test/TestOnly   后观察
 
  root                     S    0.0       0.9       :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
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:
 
 
 
 
 
 
 
 
 
 

随机推荐

  1. 表单中Readonly和Disabled的区别

    1.readonly是要锁定这个控件,通过在界面上无法修改他(但是通过javascript可以修改他). 2.disabled和readonly有相同的地方也是可以锁定这个控件用户不能改变他的值,但是 ...

  2. ASP.NET Identity系列教程(目录)

    $(document).ready(function(){ $("#hide").click(function(){ $(".en").hide(); }); ...

  3. js正则表达式大全(3)

    正则表达式regular expression详述(一) 正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符 不符合规定!!正则表达式有一个功能十分强大而又 ...

  4. c3p0的log4j配置

    com.mchange.v2.log.log4j.Log4jMLog=info,console,c3p0fileslog4j.appender.c3p0files=org.apache.log4j.D ...

  5. poj 3335(半平面交)

    链接:http://poj.org/problem?id=3335     //大牛们常说的测模板题 ------------------------------------------------- ...

  6. valuestack,stackContext,ActionContext.之间的关系

    者之间的关系如下图所示: relation ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionC ...

  7. 使用webpack-dev-middleware 和 webpack-hot-middleware 配置一个dev-server

    关于Webpack的资料教程网上已经数不胜数,但是对手动配置一个Express server的确不多,于是我对此进行着重的了解一番. webpack-dev-middleware和webpack-ho ...

  8. 【题解】Luogu P3901 数列找不同

    我博客中对莫队的详细介绍 原题传送门 不错的莫队练手题 块数就直接取sqrt(n) 对所有询问进行排序 排序第一关键词:l所在第几块,第二关键词:r的位置 考虑Ai不大,暴力开数组 add时如果加之后 ...

  9. Retrofit源码解析(下)

    接着上一章继续分析上一章主要简单说了一下基本使用和注解,这一章,我们主要看源码,废话不多说了,直接上.先上一张图 从网络上拿来的 前面一章说了一下Retrofit的简单使用https://www.cn ...

  10. poj 3264 Balanced Lineup 题解

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Subm ...