`
can_do
  • 浏览: 248033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Do家】一个Java进程到底如何占用物理内存?

阅读更多
1、首先,通过Linux监控一个Java进程,关注VmRSS指标,如下:
cat /proc/<pid>/status |grep Vm
# cat /proc/87/status |grep Vm
VmPeak: 10864592 kB
VmSize: 10534320 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:   5296072 kB
VmRSS:   5275576 kB
VmData:  5638088 kB
VmStk:       256 kB
VmExe:         4 kB
VmLib:     19624 kB
VmPTE:     11204 kB
VmSwap:        0 kB

此处,VmRSS=5275576KB,

2、检查JVM参数,如下:
-server -Xms4G -Xmx4G -Xmn1G -Xss512k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m


3、分析Java进程所包含线程数量
cat /proc/87/status |grep Threads
Threads:        270
count_threads=270

4、先初步计算JVM占用物理内存,如下:
mysql> SELECT (4*1024+512+270*0.5)*1024 as jvm_part_usage;
+----------------+
| jvm_part_usage |
+----------------+
| 4856832.0      |
+----------------+
1 row in set (0.03 sec)


5、计算从os看到的内存使用和jvm占用内存的差异量
mysql> SELECT 5275576-4856832 as change_part_usage;
+-------------------+
| change_part_usage |
+-------------------+
|            418744 |
+-------------------+
1 row in set (0.02 sec)


418744KB

6、采用JavaNIO技术,会通过DirectByteBuffer占用物理内存,可通过jmx监控,分析如下:
java.nio.BufferPool.direct.MemoryUsed=xxxxKB

【查看native memory使用】
1> jvm参数增加=>-XX:NativeMemoryTracking=summary or -XX:NativeMemoryTracking=detail
注意:采用detail模式,会导致jvm性能有5-10%的消耗,谨慎使用
2> jcmd <pid> VM.native_memory
Native Memory Tracking:

Total: reserved=5662245KB, committed=4370229KB
-                 Java Heap (reserved=4194304KB, committed=4194304KB)
                            (mmap: reserved=4194304KB, committed=4194304KB)

-                     Class (reserved=1067340KB, committed=20172KB)
                            (classes #3046)
                            (malloc=332KB #1945)
                            (mmap: reserved=1067008KB, committed=19840KB)

-                    Thread (reserved=24705KB, committed=24705KB)
                            (thread #32)
                            (stack: reserved=24576KB, committed=24576KB)
                            (malloc=93KB #168)
                            (arena=36KB #62)

-                      Code (reserved=250343KB, committed=5555KB)
                            (malloc=743KB #2004)
                            (mmap: reserved=249600KB, committed=4812KB)

-                        GC (reserved=35770KB, committed=35710KB)
                            (malloc=21306KB #175)
                            (mmap: reserved=14464KB, committed=14404KB)

-                  Compiler (reserved=144KB, committed=144KB)
                            (malloc=14KB #103)
                            (arena=131KB #3)

-                  Internal (reserved=1429KB, committed=1429KB)
                            (malloc=1365KB #4742)
                            (mmap: reserved=64KB, committed=64KB)

-                    Symbol (reserved=4964KB, committed=4964KB)
                            (malloc=2527KB #5152)
                            (arena=2437KB #1)

-    Native Memory Tracking (reserved=232KB, committed=232KB)
                            (malloc=5KB #64)
                            (tracking overhead=227KB)

-               Arena Chunk (reserved=197KB, committed=197KB)
                            (malloc=197KB)

-                   Unknown (reserved=82816KB, committed=82816KB)
                            (mmap: reserved=82816KB, committed=82816KB)


注意:NMT本身占用的内存分配,也会在NMT summary中统计出来;

7、【小结】
一个Java进程使用os物理内存的分布,可大概按如下公式计算:

JVM进程占用物理内存 ≈ MethodArea(JavaPermGen||MetaSpace) + JavaHeap(NewGen+OldGen) + CodeCache + AllThreadStack+ Java NIO

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

    linux上通过sh方式启动java jar程序并做为守护进程

    NULL 博文链接:https://qsfwy.iteye.com/blog/1650426

    内存管理内存管理内存管理

    所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。 不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存...

    Java开发技术大全(500个源代码).

    HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...

    一个进程池的服务器程序

    一个进程池的服务器程序 下面做了非常简单的http服务器,该服务器只能接收Get请求。 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子...

    JAVA WEB框架,java网站一个模块只用写一个文件

    JAVA WEB框架,java网站一个模块只用写一个文件 以前的servlet在现在的开发中已经不怎么常见,因为操作起来比较原始和麻烦。有些人就是不安于现状去改造它。 做得好的有Struts,Hybernate,Spring那么这些框架都是很...

    DoJava——Java编程辅助小工具(免安装)

    该软件是本人在学习JAVA编程时为了方便而特地用C++编写的一个免安装JAVA编程辅助工具。它主要适用于那些 讨厌使用大型集成开发工具学习JAVA的初学者。而且对于初学者来说,本人建议不要使用大型集成工具,因为这样 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    for while dowhile_javado-while循环_

    for、while、do-while循环的使用。包括循环结构的4个要素,一级介绍do-while循环结构

    JAVA 中while和do while区别

    JAVA 中while和do while区别

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    java struts如何隐藏提交后缀.action, .do.zip

    java struts如何隐藏提交后缀.action, .do

    Java中do…while循环语句实例1.pdf

    Java中do…while循环语句实例1.pdf 学习资料 复习资料 教学资源

    java 面试题 总结

    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    操作系统(内存管理)

    所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。 不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-029-Java语言概述-第一个程序-Java程序的执行流程.avi 北京动力节点-Java编程零基础教程-030-Java语言概述-重难点总结.avi 北京动力节点-Java编程零基础教程-031-Java基本语法-...

    JAVA中的POJO、VO、PO、DO、DTO都是什么?有什么区别?

    JAVA 中 的 什 么 是 POJO、VO、PO、DO、DTO 都 是 什 么 ? 他 们 有 什 么 区 别 ?

    java面试800题

    Q0058 一个Java抽象类声明了一个方法并会抛出一个异常,问继承这个抽象类的子类,实现了这个方法,这个方法声明是不是一定要抛出一模一样的异常,可不可以不抛,或者抛出的异常比抽象类的异常范围大,或者小?...

    怎样提高代码效率(Java).do

    怎样提高代码效率(Java),顾名思义,资料介绍了Java开发中的一些代码问题,可以帮助开发学习中能更好的提高开发学习效率,对于养成良好的编码习惯也有很好的帮助

Global site tag (gtag.js) - Google Analytics