zoukankan      html  css  js  c++  java
  • 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:
     
     
     
     
     
  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/xiaojianblogs/p/7473363.html
Copyright © 2011-2022 走看看