我们在开发时,测的好好的,然后上测试,上生产环境,当数据量一大时,或并发大时,就会造成各种各样的问题。
如业务逻辑上的问题,造成这种原因是前期没有沟通好,或细节没有考虑那么全面,没考虑到这种情况的存在。
当然也包括技术上的问题,如内存泄露,程序假死,CPU过高等,造成这种原因是没有测试好。
解决这样的问题,一些实用命令,操作,工具如下。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
jmap -histo pid
查看堆内存(histogram)中的对象数量,大小
num #instances #bytes class name
序号 实例个数 字节数 类名
----------------------------------------------
1: 3174877 107858256 [C
2: 3171499 76115976 java.lang.String
3: 1397884 38122240 [B
4: 214690 37785440 com.test......Book
5: 107345 18892720 com.test....Book
6: 65645 13953440 [Ljava.lang.Object;
7: 59627 7648416 <constMethodKlass>
8: 291852 7004448 java.util.HashMap$Entry
9: 107349 6871176 [[B
看看自己包下的类的个数是否有异常?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
判断JVM垃圾回收是否正常,是不是在频繁的进行,垃圾回收?
jstat -gcutil pid 1000 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
jstack <pid> 查看线程运行情况。
例如,查找关键字,
Wait on condition
Waiting for monitor entry 和 in Object.wait()
deadlockthreads
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
生产DUMP文件,分析。
jmap -dump:format=b,file=heap.bin <pid>
dump文件可以通过MemoryAnalyzer分析查看,网址:http://www.eclipse.org/mat/,可以查看dump时对象数量,内存占用,线程情况等。
但这样存在一种问题,当JVM挂掉的时候,执行此命令,会存在无响应情况
解决方法是,在JVM启动时加参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${} 这样可以在发生down机的情况下,先生成dump(未验证)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以上都是简略的提示,具体情况还要具体分析。
如业务逻辑上的问题,造成这种原因是前期没有沟通好,或细节没有考虑那么全面,没考虑到这种情况的存在。
当然也包括技术上的问题,如内存泄露,程序假死,CPU过高等,造成这种原因是没有测试好。
解决这样的问题,一些实用命令,操作,工具如下。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
jmap -histo pid
查看堆内存(histogram)中的对象数量,大小
num #instances #bytes class name
序号 实例个数 字节数 类名
----------------------------------------------
1: 3174877 107858256 [C
2: 3171499 76115976 java.lang.String
3: 1397884 38122240 [B
4: 214690 37785440 com.test......Book
5: 107345 18892720 com.test....Book
6: 65645 13953440 [Ljava.lang.Object;
7: 59627 7648416 <constMethodKlass>
8: 291852 7004448 java.util.HashMap$Entry
9: 107349 6871176 [[B
看看自己包下的类的个数是否有异常?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
判断JVM垃圾回收是否正常,是不是在频繁的进行,垃圾回收?
jstat -gcutil pid 1000 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
73.54 0.00 99.04 67.52 98.49 166 0.252 6 0.331 0.583
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
jstack <pid> 查看线程运行情况。
例如,查找关键字,
Wait on condition
Waiting for monitor entry 和 in Object.wait()
deadlockthreads
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
生产DUMP文件,分析。
jmap -dump:format=b,file=heap.bin <pid>
dump文件可以通过MemoryAnalyzer分析查看,网址:http://www.eclipse.org/mat/,可以查看dump时对象数量,内存占用,线程情况等。
但这样存在一种问题,当JVM挂掉的时候,执行此命令,会存在无响应情况
解决方法是,在JVM启动时加参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${} 这样可以在发生down机的情况下,先生成dump(未验证)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
以上都是简略的提示,具体情况还要具体分析。