• java内存和linux关系


    运行个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:
     
     
     
     
     
  • 相关阅读:
    神秘人物之comca —— 是否就是我的前车之鉴
    mfc错误:其原因可能是堆被损坏,这说明**.exe中或它加载的任何DLL
    微信公共平台php用$GLOBALS["HTTP_RAW_POST_DATA"]收不到信息解决方法
    2013蓝桥杯初赛c语言专科组题目与答案
    一道2012腾讯实习生笔试题
    文件版权自动注释,自动备份
    算法学习 三 >> 认识算法的效率(循环设计)
    算法学习 二 >> 结构化与面向对象两种算法设计的简略分析(c++/java)
    HTML入门(一)
    算法学习 一 >> 初识
  • 原文地址:https://www.cnblogs.com/xiaojianblogs/p/7473363.html
Copyright © 2020-2023  润新知