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
【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:
分享到:
相关推荐
NULL 博文链接:https://qsfwy.iteye.com/blog/1650426
所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。 不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存...
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网站一个模块只用写一个文件 以前的servlet在现在的开发中已经不怎么常见,因为操作起来比较原始和麻烦。有些人就是不安于现状去改造它。 做得好的有Struts,Hybernate,Spring那么这些框架都是很...
该软件是本人在学习JAVA编程时为了方便而特地用C++编写的一个免安装JAVA编程辅助工具。它主要适用于那些 讨厌使用大型集成开发工具学习JAVA的初学者。而且对于初学者来说,本人建议不要使用大型集成工具,因为这样 ...
对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
for、while、do-while循环的使用。包括循环结构的4个要素,一级介绍do-while循环结构
JAVA 中while和do while区别
对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
java struts如何隐藏提交后缀.action, .do
Java中do…while循环语句实例1.pdf 学习资料 复习资料 教学资源
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...
所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可。 不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存...
北京动力节点-Java编程零基础教程-029-Java语言概述-第一个程序-Java程序的执行流程.avi 北京动力节点-Java编程零基础教程-030-Java语言概述-重难点总结.avi 北京动力节点-Java编程零基础教程-031-Java基本语法-...
JAVA 中 的 什 么 是 POJO、VO、PO、DO、DTO 都 是 什 么 ? 他 们 有 什 么 区 别 ?
Q0058 一个Java抽象类声明了一个方法并会抛出一个异常,问继承这个抽象类的子类,实现了这个方法,这个方法声明是不是一定要抛出一模一样的异常,可不可以不抛,或者抛出的异常比抽象类的异常范围大,或者小?...
怎样提高代码效率(Java),顾名思义,资料介绍了Java开发中的一些代码问题,可以帮助开发学习中能更好的提高开发学习效率,对于养成良好的编码习惯也有很好的帮助