

jstat -option [-普通参数] 进程号 inteval countjstat -class [-t] 9000 1000 10

使用-gc或者-gcutil进行内存泄漏或者内存占比的分析
jinfo的使用
java -XX:+PrintFlagsFinal -version | findstr "manageable"
java -XX:+PrintFlagsInitial:查看所有JVM参数启动的初始值java -XX:+PrintFlagsFinal:产看所有JVM参数的最终值java -XX:+PrintCommandLineFlags :产看被用户或者JVM设置过的详细的XX参数的名称和值
jstat对比使用jmap -dump:live,format=b, filename="d:\1.txt" pid # 导出存活的对象-XX:+HeapDumpOnOutMemoryError 或者 -XX:HeapDumpPath=文件名



和jstat的对比





对于死锁,jstack只可以检测到由于竞争锁而引起的死锁问题。检测由于循环等待而导致的死锁信息。
也就是说:如果两个线程永久处于blok状态,才会被检测为死锁;而永久处于wait状态是不会被检测到死锁的。

图形化的界面
注意吞吐量和延迟的区别:
一些占用时间的过程
没有明显的堆存储快照
大量使用NIO
经验总结:管理32应用或者小内存时,应该注意下面的内存
出现了Connect Reset异常。
把异步调用修改成消息队列。
写的发送消息的那个阻塞I/O就是这样的问题。
使用Hahs
治标,让对象立马进入老年代。
治本,修改代码
情景描述
-XX+PrintGCDate-Stamps -Xloggc:gclong.log后,发现是由于gc准备收集到真正开始收集的的时间消耗了很长时间。原因:最小化导致工作内存被自动交换到磁盘内存当中。
解决方案:加入-Dsun.awt.keepWorkingSetOnMinimize=tre,不让它最小化的时候写入内存。
-XX:+PrintSafepointStatisticsCount=1看到waited_to_block有两个。也就是等待两个线程,并且spin时间超过了2s。-XX:safepointTimeoutDelay=2000升级硬件或者软件
永久代溢出,加上-XX:MaxPermSize=256M
编译时间和类加载时间优化
-Xverify:none-Xint调整内存设置控制垃圾收集频率,主要是Full GC
-XX:+DisableExplicitGC。选择收集器降低延迟
-XX:+UseConcMarkSweepGC + -XX:+UseParNewGC。第二个可以不加,因为是默认的新生代收集器。使用CMS的时候。-Xverify:none-Xmx512m-Xms512m-Xmn128m-XX:PermSize=256m-XX:MaxPermSize=256m-XX:+DisableExplicitGC"-XX:+UseParNew-XX:+UseConcMarkSweepGC-Xnoclassgc