`
can_do
  • 浏览: 266012 次
  • 性别: 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

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

分享到:
评论

相关推荐

    获得指定进程占用的内存大小的软件源码

    然后,我们可以编写一个函数来遍历所有进程并返回指定进程的内存使用量: ```vb Function GetProcessMemory(ByVal processName As String) As Long Dim hSnapshot As Long Dim pe As PROCESSENTRY32 Dim pmc As ...

    操作系统(内存管理)

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

    关于Java面试中基础知识的总结

    在Java面试中,基础知识是衡量一个开发者扎实程度的关键因素。以下是对Java以及相关网络和系统知识的详尽总结,帮助你在面试中表现出色。 一、Java基础知识 1. Java语言特性:理解Java的面向对象特性,包括封装、...

    整理后java开发全套达内学习笔记(含练习)

    宣告变量名称的同时,加上“final”关键词来限定,这个变量一但指定了值,就不可以再改变它的值 如:final int n1= 10; n1=20; 这就会报错 输出命令: System.out.println() 会自动换行的打印 System.out....

    华为面试题

    在一个进程中可以有多个线程同时执行,它们共享相同的内存空间。 #### Q7:项目经验中应具备哪些技能 - **技术技能**:包括编程语言(如Java、Python)、数据库管理、软件开发工具的使用等。 - **软技能**:如团队...

    2021-2022计算机二级等级考试试题及答案No.1262.docx

    多进程程序相对更健壮,因为一个进程崩溃不会影响其他进程;而多线程程序中,一个线程崩溃可能导致整个进程崩溃。 ### 9. Access窗体视图类型 - **问题**:不属于Access的窗体视图的是哪一个? - **答案**:“查询...

    2021-2022计算机二级等级考试试题及答案No.14428.docx

    线程间的切换更快,但一个线程的崩溃可能影响整个进程。 17. HTTP是超文本传输协议,是访问Web资源的协议标识。 18. 计算机病毒是人为编写的恶意程序,不是由于编程错误产生。 19. 组合框控件结合了列表框和...

    2021-2022计算机二级等级考试试题及答案No.18887.docx

    而线程则是进程中轻量级的执行单元,同一进程内的线程共享相同的内存空间,因此通信更为简便,但这也意味着一旦一个线程出现错误,可能会影响到整个进程。在实际应用中,进程更适合于实现高可用性和安全性要求较高的...

    2015中兴笔试B卷

    - **管道流**:管道是一种特殊的输入/输出流,它允许一个线程向另一个线程发送数据。在Java中,可以通过`PipedInputStream`和`PipedOutputStream`来实现管道流的功能。 #### 五、数据类型 - **字节型 byte**:占用...

    2021-2022计算机二级等级考试试题及答案No.14517.docx

    27. 自动编号字段:在一个表中通常只能有一个自动编号字段。 28. 继续列举相关知识点: - 数据库设计包括概念设计、逻辑设计和物理设计,实施阶段主要是将逻辑设计转化为物理数据库。 - 在VBA中,For...Next和Do.....

    2021-2022计算机二级等级考试试题及答案No.9667.docx

    3. **字符串存储**:字符串在内存中通常作为一维字符数组存储,每个字符占一个字节。 4. **MySQL客户端工具**:MySQL的客户端工具包括命令行界面(mysql命令行)、图形化界面如phpMyAdmin和Navicat,而mysqld是...

    南财大计算机应用基础第二套.pdf

    6. Windows 2000:这是一个多任务图形用户界面的操作系统,选项D正确。 7. VB变量名:VB(Visual Basic)中,变量名不能与保留关键字相同,Name可以作为变量名,而Date、Integer、Boolean都是VB的保留关键字。选项D...

    Ubuntu命令技巧.pdf

    **4.6 强制中止一个进程** - 使用 `kill -9 &lt;pid&gt;` 命令强制终止指定PID的进程。 **4.7 图形方式中止一个程序** - 在Unity或GNOME桌面环境中右键点击任务栏上的程序图标,选择“结束任务”。 **4.8 查看当前进程的...

    apache tomcat mysql多服务器集群负载均衡

    配置中,`MaxKeepAliveRequests`定义了一个连接的最大请求数,`ThreadsPerChild`和`MaxRequestsPerChild`设置了Apache进程和线程的数量。此外,`JkWorkersFile`定义了与Tomcat服务器的连接信息,`JkMount`规则指定...

    掌上游戏机

    例如,每个游戏对象可能需要一个类来封装其属性和方法,通过更新这些对象的状态来推进游戏进程。 对于描述中的"难度比较大",可能意味着这个游戏项目包含复杂的算法或者高度交互性的设计。例如,游戏可能会有AI...

    2021-2022计算机二级等级考试试题及答案No.9184.docx

    2. 逻辑运算符Sgn(5):Sgn函数用于返回一个数的符号,正数返回1,负数返回-1,0返回0。因此Sgn(5)的结果是1。 3. 标识符的合法性:在编程语言中,标识符用于命名变量、函数等。cout、FOR和_00是合法的标识符,但&&a...

    C++华为面试提纲

    - **快速排序**:选择一个基准元素,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的小,则可分别对这两部分记录继续进行排序。 - **归并排序**:采用分治法的思想,将数组分成...

    2021-2022计算机二级等级考试试题及答案No.13097.docx

    - **Servlet**:是Java的一个标准接口,用于扩展应用程序服务器的功能,JSP页面编译后会变成一个实现了这个接口的类。 #### 5. 判断字符是否为小写字母 - **知识点**: C语言中判断字符是否为小写字母的方法。 - ...

Global site tag (gtag.js) - Google Analytics