JDK NEW TOOLS (监视JVM)

http://www.diybl.com/course/3_program/java/javajs/2008318/104919.html
最近压力测试和调优Liferay portal,所以需要找到一种工具,可以比较好的监测VM工具。本来想使用商用工具,但偶然间发现SUN 的JDK中新添了几个工具,并且非常好用。秉承着有免费,不用商用的原则。开始使用新的JDK工具,以下简单介绍一下这几种工具。(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装)

我一共找到以下四个工具:
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jmap:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

接下来是对这些工具的详细介绍:

从最简单的jstat工具开始:我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其id。jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。
使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打)

接下来是jstat,我之所以这次调优Liferay portal是因为,liferay在默认的情况下,并发用户一多就会产生perm out of momery异常。虽然很开就解决了,但发现对VM内存使用量监控的重要性。通过google,很快的发现了jstat这个工具。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=String 3024可以将3024进程的内存heap输出出来到String文件里。

jconsole是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。由于是GUI程序,这里就不详细介绍了,不会的地方可以参考SUN的官方文档。
使用方法:命令行里打 jconsole,选则进程就可以了。

以下是这些工具的SUN官方说明:
jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

附加:windows查看进程号,由于任务管理器默认的情况下是不显示进程id号的,所以可以通过如下方法加上。ctrl+alt+del打开任务管理器,选择‘进程’选项卡,点‘查看’->''选择列''->加上''PID'',就可以了。

文章出处:http://www.diybl.com/course/3_program/java/javajs/2008318/104919.html

 

Abnormal build process termination: "D:\Program Files\IDEA\IntelliJ IDEA 2025.2\jbr\bin\java.exe" -Xmx700m -Djava.awt.headless=true "-Djna.boot.library.path=D:\Program Files\IDEA\IntelliJ IDEA 2025.2/lib/jna/amd64" -Djna.nosys=true -Djna.noclasspath=true --add-opens jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-opens jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED -Dexternal.project.config=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\projects\lims.3c898e48\external_build_system -Dcompile.parallel=true -Drebuild.on.dependency.change=true -Didea.IntToIntBtree.page.size=32768 -Djdt.compiler.useSingleThread=true -Daether.connector.resumeDownloads=false -Dio.netty.initialSeedUniquifier=6045328016711105503 -Djps.use.dependency.graph=true -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2025.2 "-Didea.home.path=D:/Program Files/IDEA/IntelliJ IDEA 2025.2" -Didea.config.path=C:/Users/Administrator/AppData/Roaming/JetBrains/IntelliJIdea2025.2 -Didea.plugins.path=C:/Users/Administrator/AppData/Roaming/JetBrains/IntelliJIdea2025.2/plugins -Djps.log.dir=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\log\build-log "-Djps.fallback.jdk.home=D:/Program Files/IDEA/IntelliJ IDEA 2025.2/jbr" -Djps.fallback.jdk.version=21.0.7 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=C:/Users/Administrator/AppData/Local/JetBrains/IntelliJIdea2025.2/compile-server/lims-shly_840d39d1/_temp_ -Djps.backward.ref.index.builder=true -Djps.backward.ref.index.builder.fs.case.sensitive=false "-Djps.kotlin.home=D:\Program Files\IDEA\IntelliJ IDEA 2025.2\plugins\Kotlin\kotlinc" -Dkotlin.incremental.compilation=true -Dkotlin.jps.dumb.mode=true -Dkotlin.jps.enable.lookups.in.dumb.mode=true -Dkotlin.incremental.compilation.js=true -Dkotlin.daemon.enabled -Dkotlin.daemon.client.alive.path=C:\Users\ADMINI~1\AppData\Local\Temp\kotlin-idea-8690595407329842680-is-running -Dkotlin.incremental.compilation=true -Dkotlin.jps.dumb.mode=true -Dkotlin.jps.enable.lookups.in.dumb.mode=true -Dkotlin.incremental.compilation.js=true -Dkotlin.daemon.enabled -Dkotlin.daemon.client.alive.path=C:\Users\ADMINI~1\AppData\Local\Temp\kotlin-idea-8690595407329842680-is-running -Dide.compiler.maven.path.to.home=E:\maven\apache-maven-3.6.3-bin\repository -Dide.propagate.context=false -Dintellij.platform.log.sync=true -classpath "D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/jps-launcher.jar" org.jetbrains.jps.cmdline.Launcher "D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/jps-builders.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/jps-builders-6.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/jps-javac-extension.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/util-8.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/util_rt.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/platform-loader.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/annotations.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/trove.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/kotlin-metadata.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/protobuf.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/rt/netty-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/jps-model.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/javac2.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/forms_rt.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/util.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/lib-client.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/aether-dependency-resolver.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/maven-resolver-connector-basic.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/maven-resolver-transport-file.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/maven-resolver-transport-http.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/idea_rt.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/JavaEE/lib/jasper-v2-rt.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/Kotlin/lib/jps/kotlin-jps-plugin.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/lib/util-8.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/javaFX/lib/javaFX-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/javaFX/lib/javaFX-common.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/eclipse/lib/eclipse-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/eclipse/lib/eclipse-common.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/JavaEE/lib/jps/javaee-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/platform-langInjection/lib/java-langInjection-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/Groovy/lib/groovy-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/Groovy/lib/groovy-constants-rt.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/maven/lib/maven-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/gradle-java/lib/gradle-jps.jar;D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/JPA/lib/jps/javaee-jpa-jps.jar" org.jetbrains.jps.cmdline.BuildMain 127.0.0.1 49955 dc1fbe86-22cc-4b93-a3a1-50c9392808ed C:/Users/Administrator/AppData/Local/JetBrains/IntelliJIdea2025.2/compile-server Be careful, logger will be shut down earlier than application: Unable to make field private static java.util.IdentityHashMap java.lang.ApplicationShutdownHooks.hooks accessible: module java.base does not "opens java.lang" to unnamed module @682a0b20 Build process started. Classpath: D:/Program Files/IDEA/IntelliJ IDEA 2025.2/plugins/java/lib/jps-launcher.jar JAVAC_PROCESS[STDOUT]: # JAVAC_PROCESS[STDOUT]: # There is insufficient memory for the Java Runtime Environment to continue. JAVAC_PROCESS[STDOUT]: # Native memory allocation (malloc) failed to allocate 375328 bytes for Chunk::new JAVAC_PROCESS[STDOUT]: # An error report file with more information is saved as: JAVAC_PROCESS[STDOUT]: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\hs_err_pid22588.log JAVAC_PROCESS[STDOUT]: [thread 21232 also had an error] JAVAC_PROCESS[STDOUT]: # JAVAC_PROCESS[STDOUT]: # There is insufficient memory for the Java Runtime Environment to continue. JAVAC_PROCESS[STDOUT]: # Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate JAVAC_PROCESS[STDOUT]: # An error report file with more information is saved as: JAVAC_PROCESS[STDOUT]: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\hs_err_pid27164.log JAVAC_PROCESS[STDOUT]: [thread 2064 also had an error] JAVAC_PROCESS[STDOUT]: # JAVAC_PROCESS[STDOUT]: # Compiler replay data is saved as: JAVAC_PROCESS[STDOUT]: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\replay_pid22588.log 2025-08-26 13:27:42,498 [ 7595] WARN - io.netty.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:401) at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:434) at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:255) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.handle(AbstractNioChannel.java:444) at io.netty.channel.nio.NioIoHandler$DefaultNioRegistration.handle(NioIoHandler.java:386) at io.netty.channel.nio.NioIoHandler.processSelectedKey(NioIoHandler.java:585) at io.netty.channel.nio.NioIoHandler.processSelectedKeysPlain(NioIoHandler.java:530) at io.netty.channel.nio.NioIoHandler.processSelectedKeys(NioIoHandler.java:503) at io.netty.channel.nio.NioIoHandler.run(NioIoHandler.java:478) at io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:203) at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:174) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1123) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) JAVAC_PROCESS[STDOUT]: # JAVAC_PROCESS[STDOUT]: # There is insufficient memory for the Java Runtime Environment to continue. JAVAC_PROCESS[STDOUT]: # Native memory allocation (malloc) failed to allocate 590480 bytes for Chunk::new JAVAC_PROCESS[STDOUT]: # An error report file with more information is saved as: JAVAC_PROCESS[STDOUT]: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\hs_err_pid18280.log JAVAC_PROCESS[STDOUT]: # JAVAC_PROCESS[STDOUT]: # Compiler replay data is saved as: JAVAC_PROCESS[STDOUT]: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\replay_pid27164.log # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 319696 bytes. Error detail: Chunk::new # An error report file with more information is saved as: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\hs_err_pid25952.log 2025-08-26 13:27:42,520 [ 7617] WARN - io.netty.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:401) at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:434) at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:255) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.handle(AbstractNioChannel.java:444) at io.netty.channel.nio.NioIoHandler$DefaultNioRegistration.handle(NioIoHandler.java:386) at io.netty.channel.nio.NioIoHandler.processSelectedKey(NioIoHandler.java:585) at io.netty.channel.nio.NioIoHandler.processSelectedKeysPlain(NioIoHandler.java:530) at io.netty.channel.nio.NioIoHandler.processSelectedKeys(NioIoHandler.java:503) at io.netty.channel.nio.NioIoHandler.run(NioIoHandler.java:478) at io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:203) at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:174) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1123) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) JAVAC_PROCESS[STDOUT]: # JAVAC_PROCESS[STDOUT]: # Compiler replay data is saved as: JAVAC_PROCESS[STDOUT]: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\replay_pid18280.log 2025-08-26 13:27:42,593 [ 7690] WARN - io.netty.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:401) at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:434) at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:255) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.handle(AbstractNioChannel.java:444) at io.netty.channel.nio.NioIoHandler$DefaultNioRegistration.handle(NioIoHandler.java:386) at io.netty.channel.nio.NioIoHandler.processSelectedKey(NioIoHandler.java:585) at io.netty.channel.nio.NioIoHandler.processSelectedKeysPlain(NioIoHandler.java:530) at io.netty.channel.nio.NioIoHandler.processSelectedKeys(NioIoHandler.java:503) at io.netty.channel.nio.NioIoHandler.run(NioIoHandler.java:478) at io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:203) at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:174) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1123) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) # # Compiler replay data is saved as: # C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2025.2\compile-server\replay_pid25952.log 这是什么报错
最新发布
08-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值