1.现象
CPU利用率高.
应用缓慢或无法对外提供服务.
2.原因
1.死循环
2.JVM堆占用过大-高频率FULL-GC
3.排查方法
1.使用top命令找出CPU消耗最大的进程
2.使用top -Hp 进程(上一步得到的进程号),找出消耗CPU的线程.
3.使用[jstack 进程与jstat -gcutil 进程 1000 100],找出线程在执行何种操作..
如果线程非GC线程,则直接可以根据调用堆栈找出具体的代码...
否则进行如下操作.
1.jstat -gcutil pid 1000 100用此命令跟踪GC回收...
4.jmap -dump:format=b,file=memoryfile.bin 【pid】
5.sz memoryfile.bin
6.使用mat打开memoryfile.bin文件.然后分析内存.找出内存问题解决..
4.实战
5.线上实例
六.例子源码
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestMemory{
//private static byte[] byteArray=new byte[1024*1024*170];
private static List<Object> linkList=new LinkedList<Object>();
private static long count=1024*1024*240/56;
//private static List<Object> list=new CopyOnWriteArrayList<Object>();
public static void main(String[] args) throws Throwable{
for(int index=0;index<count;++index){
linkList.add(new Object ());
}
ExecutorService service= Executors.newFixedThreadPool(5);
for (int index=0;index<5;++index) {
service.submit(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(100);
test();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
});
}
System.in.read();
}
private static void test(){
byte[] bytes=new byte[1024*1024];
System.out.printf(bytes.toString());
}
}
public class TestProfile {
private Map<TestHashCode,Object> map=new HashMap<TestHashCode,Object>();
private static Object obj=new Object();
public static void main(String[] args) throws Throwable {
new TestProfile().test1();
}
public void test1() throws Throwable{