`

死磕内存篇 --- 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:
 
 
 
https://www.cnblogs.com/springsource/p/6097736.html 
 
 
分享到:
评论

相关推荐

    【死磕Java集合】-集合源码分析.pdf

    Java集合框架是Java语言中一个非常重要的组件,提供了多种数据结构和算法来存储和操作数据。在Java集合框架中,LinkedList、ArrayList、HashMap、TreeMap等都是非常常用的数据结构。本文将对Java集合框架的源码进行...

    死磕spring源码系列-SpringAop十分钟快速入门

    死磕spring源码系列-SpringAop十分钟快速入门

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring 使用 `java.lang.reflect.Proxy` 类来创建动态代理,并通过实现 `java.lang.reflect.InvocationHandler` 接口来处理代理对象的方法调用。在 Spring AOP 中,`org.springframework.aop.framework....

    [] - 2023-07-06 那些在一个公司死磕了 5 - 10 年的人,最后都怎么样了?.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    死磕spring源码系列-深度解析spring aop

    死磕spring源码系列-深度解析spring_aop

    joeylv#joscrapy#【死磕Java并发】—–Java内存模型之重排序1

    下面我们用一个简单的示例来说明:A、B、C三个操作存在如下关系:A、B不存在数据依赖关系,A和C、B和C存在数据依赖关系,因此在进行重排序的时候,A、B可以随意

    Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka

    『死磕Java并发编程系列』 02 面试官:说说什么是Java内存模型? 『死磕Java并发编程系列』 03 面试必问的CAS原理你会了吗? 『死磕Java并发编程系列』 04 面试官:说说Atomic原子类的实现原理? 『死磕Java并发编程...

    JAVA语言程序设计基础篇课后编程题答案

    Java语言是目前广泛应用的编程语言,尤其在企业级应用和互联网开发中占据着重要地位。对于初学者来说,掌握Java的基础至关重要。《JAVA语言程序设计基础篇》是一本面向大学计算机专业学生的教材,旨在帮助学生建立...

    JAVA_正则表达式简介

    Java中的正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换操作。正则表达式由特殊字符和普通字符组成,它们共同定义了一个特定的搜索模式。 首先,我们来看英文句点符号(`.`)。在正则...

    RGP-NETTY:死磕NETTY原始码-NETTY原始码深度解析

    《RGP-NETTY:死磕NETTY原始码-NETTY原始码深度解析》 Netty,一个高性能、异步事件驱动的网络应用框架,广泛应用于分布式系统、云计算平台以及游戏服务器等领域。它为Java开发者提供了构建高并发、低延迟、高可用性...

    300页Java和大数据面试.pdf

    《300页Java和大数据面试.pdf》是一份详尽的面试指南,涵盖了Java和大数据领域的核心知识,旨在帮助求职者准备面试。这份文档的结构严谨,内容丰富,旨在提升面试者的专业素养和应试能力。 在Java部分,文档深入...

    selenium-webdriver-java版指南

    ### Selenium WebDriver Java 版指南:关键技术点解析 #### 一、启动浏览器 在Selenium WebDriver进行自动化测试时,启动浏览器是整个流程的第一步。通过Java编程语言,我们可以轻松地实现这一目标。 **代码示例**...

    IOC-死磕.xmind

    此资源对于想要观看spring源码的童鞋会很有帮助,但是要自己一步步跟代码才会有效果,另外关于ioc实现细节众多,这里只是提供一个整体的思路,要想完全吃透,必须得配合自己写的大量测试用例来跟代码

    Zookeeper死磕到底.pdf

    在分布式系统中,边界是自然存在的,比如进程间的边界,使得进程间通信成为了一项挑战。传统的进程间通信方式,如Socket,虽然能够实现交流,但随着进程数量的增长,管理复杂度呈指数级上升,类似于穿错衣服的人们...

    死磕Java之Java数据类型的来龙去脉

    (一)面试题:Java已经有了int等基本类型了,为什么还需要包装类?(二)基本数据类型与包装类的对应关系(三)包装类的自动拆箱与装箱(四)包装类总结 一、数据类型分类 数据类型可以分为基本数据类型(8个)和...

    死磕ThreadPoolExecutor线程池.pdf

    死磕ThreadPoolExecutor线程池.pdf!!死磕ThreadPoolExecutor线程池.pdf死磕ThreadPoolExecutor线程池.pdf死磕ThreadPoolExecutor线程池.pdf

    死磕以太坊源码分析全部文章

    一共大概20篇文章,适合智能合约开发工程师,区块链开发工程师,底层公链开发工程师 阅读,希望可以帮助到你们,如果发现哪里有不对的 地方,希望可以给出指正。

    基于Java-web的音乐网站设计与实现

    3. Mysql数据库:Mysql是一个流行的关系数据库管理系统,提供了高性能、可靠性和安全性的数据库解决方案。Mysql数据库使开发者可以轻松地存储和管理大量数据。 4. Ajax技术:Ajax(Asynchronous JavaScript and XML...

    死磕Lambda表达式(二):Lambda的使用

    在本篇文章中,我们将深入探讨Lambda表达式的使用及其与函数式接口的关系。 首先,Lambda表达式常用于需要传递代码块的场景。在给出的示例中,`maskList.sort((Mask o1, Mask o2) -> o1.getBrand().compareTo(o2....

Global site tag (gtag.js) - Google Analytics