「java获取jvm内存」java获取jvm内存信息
今天给各位分享java获取jvm内存的知识,其中也会对java获取jvm内存信息进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
如何查看java虚拟机堆内存的参数值
请确保java_home/bin配置到path环境变量下,因为这些工具都在jdk的bin目录下
jps(JVM Process Status Tool):JVM机进程状况工具
用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。使用jps时,不需要传递进程号做为参数。
Jps也可以显示远程系统上的JAVA进程,这需要远程服务上开启了jstat服务,以及RMI注及服务,不过常用都是对本对的JAVA进程的查看。
命令格式:jps [ options ] [ hostid ]
常用参数说明:
-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
-v 输出传给JVM的参数。
例如:
C:\Users\Administratorjps -lmv
1796 -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -XX:MaxPermSize=256m
7340 sun.tools.jps.Jps -lmv -Denv.class.path=.;D:\DevTools\VM\jdk1.6.0_31\\lib\dt.jar;D:\DevTools\VM\jdk1.6.0_31\\lib\tools.jar; -Dapplication.home=D:\DevTools\VM\jdk1.6.0_31 -Xms8m
其中pid为1796的是我的eclipse进程,pid为7340的是jps命令本身的进程
jinfo(Configuration Info for Java):JVM配置信息工具
可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数
命令格式:jinfo [ options ] [ pid ]
常用参数说明:
-flag 输出,修改,JVM命令行参数
例如:
C:\Users\Administratorjinfo 1796
将会打印出很多jvm运行时参数信息,由于比较长这里不再打印出来,可以自己试试,内容一目了然
Jstack(Stack Trace for Java):JVM堆栈跟踪工具
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64“
命令格式:jstack [ option ] pid
常用参数说明:
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.
-h | -help打印帮助信息
例如:
C:\Users\Administratorjstack 1796
2013-05-22 11:42:38
Full thread dump Java HotSpot(TM) Client VM (20.6-b01 mixed mode):
"Worker-30" prio=6 tid=0x06514c00 nid=0x1018 in Object.wait() [0x056af000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
- locked 0x1ad84a90 (a org.eclipse.core.internal.jobs.WorkerPool)
at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:50)
......
......
......
......
jstat(JVM statistics Monitoriing Tool):JVM统计信息监视工具
对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控
命令格式:jstat [ option pid [interval [ s | ms ] [count] ] ]
常用参数说明:
-gcutil 输出已使用空间占总空间的百分比
-gccapacity 输出堆中各个区域使用到的最大和最小空间
例如:每隔1秒监控jvm内存一次,共监控5次
C:\Users\Administratorjstat -gccapacity 1796 1s 5
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 97
C:\Users\Administratorjstat -gcutil 1796 1s 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
一些术语的中文解释:
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
jmap( Memory Map for Java):JVM内存映像工具
打印出某个java进程(使用pid)内存内的所有‘对象’的情况(如:产生那些对象,及其数量)
命令格式:jmap [ option ] pid
常用参数说明:
-dump:[live,]format=b,file=filename 使用二进制形式输出jvm的heap内容到文件中, live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
例如:以二进制形式输入当前堆内存映像到文件data.hprof中
jmap -dump:live,format=b,file=data.hprof 1796
生成的文件可以使用jhat工具进行分析,在OOM(内存溢出)时,分析大对象,非常有用
通过使用如下参数启动JVM,也可以获取到dump文件:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pidpid.hprof
在jvm发生内存溢出时生成内存映像文件
jhat(JVM Heap Analysis Tool):JVM堆转储快照分析工具
用于对JAVA heap进行离线分析的工具,他可以对不同虚拟机中导出的heap信息文件进行分析,如LINUX上导出的文件可以拿到WINDOWS上进行分析,可以查找诸如内存方面的问题。
命令格式:jhat dumpfile(jmap生成的文件)
例如:分析jmap导出的内存映像
怎么查看Java(jvm)虚拟机的大小
由于java应用的允许依赖于JVM(虚拟机),相应的内存配置显然也需要JVM来提供的,准备地说是通过/bin/java.exe的启动命令参数来实现的。具体的配置项如下几种:-XmxJavaHeap最大值(默认值为物理内存的1/4)-XmsJavaHeap初始值-XmnJavaHeapYoung区大小-Xss每个线程的Stack大小拓展,以下是几种使用示例:1、命令下启动应用并配置内存:java-Xmx128m-Xms64mTest2、eclipse内存配置:-vmargs-Xms40m-Xmx512m的配置信息,请自行搜索“jvm内存”。
java 如何获得一个进程的内存使用情况,cpu运行的时间
首先有个基本问题需要了解一下:
这里所说java里获得一个进程的内存使用情况和cpu运行时间,是指在java内部获取一个纯外部进程的内存与cpu时间呢,还是指在java内部,由java启动的进程的内存与cpu时间。
如果是第一种情况,那你还需要在java内部再起一个进程,通过执行操作系统的shell命令来查看那个进程的运行状态。比如那个外部进程的ID为3119,则执行cat /proc/3119/status | grep VmRSS就可以过滤出该进程的物理内存占用量。
如果是第二种情况,(假定你问的就是这种情况)。
先说内存占用量:一般说来,你可以使用这两种方式获取内存使用情况
方式一:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage(); //椎内存使用情况
long totalMemorySize = memoryUsage.getInit(); //初始的总内存
long maxMemorySize = memoryUsage.getMax(); //最大可用内存
long usedMemorySize = memoryUsage.getUsed(); //已使用的内存
方式二:
Runtime rt = Runtime.getRuntime();
long totalMemorySize = rt.totalMemory(); //初始的总内存
long maxMemorySiz = t.maxMemory(); //最大可用内存
long freeMemorySize = rt.freeMemory(); //当前可用内存
需要说明的是,这种方式获取的是整个jvm的内存使用情况,并不是某一个进程的内存使用情况,事实上,在java内部,可以使用Rumtime.getRuntime().exec(${SHELL})来开启一个外部进程(这里${SHELL}代表一个可操作系统的shell命令)。而运行Java程序整个jvm,对于操作系统而言,也仅仅只是一个进程。也就是说,一个jvm就是一个进程,你通过java程序开启的进程都是外部进程,java内部目前还提供了一个destroy方法来销毁该进程,对于该进程的其它信息,都无法直接获取,这些信息的获取,显然需要本地化(Local)的实现。既然标准jdk库没有,就不可能再通过平台无关的代码来实现了。典型的做法就是使用前面第一种情况的方式,再启一个进程,执行shell命令来获取。
不过对于cpu使用时间,采用标准java代码倒是可以拿到。由于java的语法很啰嗦,举一个较完全的例子需要太多的代码,我这里就只写最关键的代码:
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime(); //当前线程的cpu使用时间
long someThreadId = 709817L; //假定有某个线程的ID是709817
② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId); //获取ID为someThreadId即709817的线程的cpu时间
基于上面的核心api,你可以把由java启动的外部进程放到一个单独的线程中执行,再用代码②的方式来获取该进程的cpu使用时间,也可以将外部进程放入到当前线程中执行,用① 的方式来获得进程的cpu使用时间。
关于java获取jvm内存和java获取jvm内存信息的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-22,除非注明,否则均为
原创文章,转载请注明出处。