此博客文章更详细地解释了JDK的常用工具,GC日志信息的查看,JMS远程监视的使用等,这些信息可以为最初学习JVM优化的开发人员提供参考。
内容
Tomcat是一种常用的Web容器,它是在JVM(Java虚拟机)中运行的Java进程。
本文以Tomcat为例,借助一些JDK工具来监视Tomcat在操作过程中的内存使用情况,并为优化提供数据支持。
1使用JDK工具
JDK附带的工具位于$ {JAVA_HOME} / bin /目录中。
JConsole可以轻松清晰地查看内存使用情况,线程状态,当前加载的类总数等。

JVisualVM可以下载插件(例如GC等)来查看更丰富的信息。如果要分析本地Tomcat,还可以执行内存采样等检查每个类的使用情况。
(1) jps查看本地运行的Java进程,其进程号,进程开始的路径以及其他信息;
([2) jmap视图垃圾回收策略,即JVM内存使用情况:
jmap -heap pid#查看垃圾回收策略以及堆内存的分配和使用。
jmap -clstats pid#查看类加载器的统计信息-此命令调用sun.jvm.hotspot.runtime.VM.initialize()方法,这将导致与pid相对应的JVM进程阻塞。

jmap -histo [pid]#根据内存使用情况以相反的顺序列出内存中的实例类型。
([3) jstack视图线程堆栈:
jstack pid#列出与pid对应的JVM的所有线程堆栈描述,主要包括每个线程的状态以及堆栈中每个堆栈帧的完全限定名称和代码位置。注意:显示此信息仅是为了方便开发人员阅读,而不是将该信息存储在堆栈中。
([4) jstat实时查看堆内存的使用情况:
# 使用方法:
jstat -2查看GC日志信息

您可以配置JVM的启动参数,打印类的加载状态和对象的回收信息,这些信息可以打印到屏幕或指定的文件,也可以打印到catalina.log默认。 Tomcat容器的JVM启动参数配置文件为:$ {TOMCAT_HOME} /bin/catalina.sh,具体参数如下:
-verbose:gc
# 在输出设备显示垃圾收集信息(JVM发生内存回收时输出相关信息)
-XX:+PrintGC
# 输出GC日志, 形式: Full GC 118250K->113543K(130112K), 0.0094143 secs
-XX:+PrintGCDetails
# 输出GC详细日志, 形式: GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs[Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps
# 输出GC的时间戳, 以基准时间的形式输出: 11.851: [GC 98328K->93620K(130112K), 0.0082960 secs], 11.851是JVM启动后的秒数.
-XX:+PrintGCDateStamps
# 输出GC的时间戳, 以日期的形式输出: 2018-08-28T21:53:59.234+0800
-XX:+PrintGCApplicationStoppedTime
# 打印垃圾回收期间程序暂停的时间, 即GC消耗的时间. 可与上面混合使用.
# 输出形式: Total time for which application threads were stopped: 0.0468229 seconds
-XX:+PrintGCApplicationConcurrentTime
# 打印每次垃圾回收前, 程序未中断的执行时间, 即相邻2次GC的间隔.
# 可以和上面的配置混合使用. 输出形式: Application time: 0.5291524 seconds
-XX:+PrintTenuringDistribution
# 观察各个Age的对象总大小
-XX:PrintHeapAtGC
# 打印GC前后的详细堆栈信息
-XX:+HeapDumpOnOutOfMemoryError
# 发生OOM时自动dump堆栈信息, 以便后续分析
-Xloggc:../logs/gc.log
# 与上面选项配合使用, 将日志信息输出到指定的文件以便后续分析
3添加JMS远程监视
对于在LAN中其他服务器上部署的Tomcat,可以打开JMX监视端口,然后可以通过另一台服务器上的端口查看常用参数(不支持某些更复杂的功能)。
配置方法:在JVM启动参数中配置相同,配置如下:
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=172.16.11.62 # 设置JVM的JMS的IP地址, 防止错误为本机127.0.0.1地址
-Dcom.sun.management.jmxremote.port=1090 # 设置JVM的JMS监控的端口
-Dcom.sun.management.jmxremote.ssl=false # 设置JVM的JMS监控不实用SSL
-Dcom.sun.management.jmxremote.authenticate=false # 设置JVM的JMS监控不需要认证
参考资料
在JVM运行时监视内存使用情况
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-374529-1.html
仅说数量了