开发时有没有遇到什么问题?

1.频繁GC

有一次架构组把部署机降容,stg环境从内存2G变成1G,一台机器的cpu 一直80%以上,报警。服务重启几次以后,还是会报警,cpu load还是很高
**第一步 登机器用 top 命令查看进程资源占用情况。**不出所料,Java进程把CPU撑爆了,获取java进程PID1开发时有没有遇到什么问题?

第二步 用了 top -H -p6902 (6902是Java进程的PID1)命令找出了具体的线程资源占用情况
至此可以看出 具体是哪些线程的获取了大量的cpu资源 可以获取的线程的PID2。
开发时有没有遇到什么问题?

第三步 这时,我们就可以使用jstack来查找这些id对应的具体线程堆栈信息了。jstack是JDK内置的堆栈跟踪工具,先把pid2转成16进制的编码id2 通过命令 jstack PID1 | grep -C 20 id2 获取到了具体的线程信息
通过线程堆栈信息发现是GC的线程,Java的垃圾回收把CPU的资源耗尽了。
开发时有没有遇到什么问题?

第四步,发现是GC问题后,可以通过jstat来观察,jstat可以对堆内存的使用情况进行实时统计,使用了命令 jstat -gcutil 6902 2000 10 (6902是Java进程的PID1)来观察GC的运行信息
**E(Eden区)跟O(Old区)的内存已经被耗尽了,FGC(Full GC)的次数高达6989次,FGCT(Full GC Time)的时间高达36453秒,**即平均每次FGC的时间为:36453/6989 ≈ 5.21秒。也就是说,Java进程都把时间花在GC上了,所以就没有时间来处理其他事情。
开发时有没有遇到什么问题?第五步 我们就可以使用jmap查看Java的内存占用信息。jmap是JDK内置的内存映射工具,位于JDK根目录的bin文件夹下面,可用于获取java进程的内存映射信息。通过命令 jmap -histo 6902 (6902是Java进程的PID)打印出了Java的内存占用信息
然后也没有发现内存泄露,但是内存很小,于是估计是tomcat 里面的JVM设错了,
发现 -Xms2G -Xmx2G -XX:PermSize=512m -XX:MaxPermSize=1024m
-Xmx Java Heap最大值
-Xms Java Heap初始值
但是后面机器缩容了,只有一个G,所以上面的配置没有生效,默认为物理内存的1/4,只有256M,就一直GC了