JAVA 调试高内存占用与CPU满载异常场景

发布时间 2023-07-05 15:32:35作者: hongdada

高内存占用,堆溢出,OOM

代码:

	@RequestMapping(value = "/oom", method = {RequestMethod.GET})
	public ResultBase getMessage2() throws InterruptedException {

		List<String> strList = Lists.newArrayList();
		for (int i = 0; i < 10240; i++) {
			strList.add("hongdaddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + i);
		}
		Thread.sleep(600000);

		return ResultBase.getSuccessResult(ResultDTO.of().setResult(null));
	}

内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存

内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

服务启动:

nohup java -Dserver.port=8070 -Xms200m -Xmx200m -verbose:gc -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./oom_dump.hprof -Dfile.encoding=UTF-8 -jar chatgpt-web-0.0.1-SNAPSHOT.jar >info.log 2>&1 &

jmap查看:

❯ jmap -heap 885
Attaching to process ID 885, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
....

多次调用接口,生成大对象:

curl http://172.29.168.205:8070/oom

生成hrpof:

jmap -dump:live,format=b,file=heapdump.hprof 885

查看最大对象:

image-20230705114155364

查看大对象传出引用:

image-20230705114418728

查看大对象传入引用:

image-20230705114253577

CPU满载

代码:

	@RequestMapping(value = "/cpu", method = {RequestMethod.GET})
	public ResultBase cpu() throws InterruptedException {
		long i = 0;
		while (true) {
			i++;
			if (i == 999999123456L) {
				break;
			}
		}
		return ResultBase.getSuccessResult(ResultDTO.of().setResult(null));
	}

使用top命令查看cpu过高的pid

image-20230705135300934

查看cpu过高的线程id tid

top -Hp 30318  
or
top 然后 Shift+H

image-20230705135351341

cpu过高的线程tid:30394

打印java堆栈跟踪信息到stack.txt文件

jstack 30318 >stack.txt

转换线程id为16进制格式

❯ printf '%x\n' 30394
76ba

筛选查看cpu过高的堆栈信息

❯ rg 76ba stack.txt -A20 -B 20
149-    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
150-    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
151-    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
152-    at java.lang.Thread.run(Thread.java:748)
153-
154-"http-nio-8070-exec-2" #27 daemon prio=5 os_prio=0 tid=0x00007fad350f9000 nid=0x76bb waiting on condition [0x00007facad5d3000]
155-   java.lang.Thread.State: WAITING (parking)
156-    at sun.misc.Unsafe.park(Native Method)
157-    - parking to wait for  <0x00000000faa27200> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
158-    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
159-    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
160-    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
161-    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:108)
162-    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
163-    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
164-    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
165-    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
166-    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
167-    at java.lang.Thread.run(Thread.java:748)
168-
169:"http-nio-8070-exec-1" #26 daemon prio=5 os_prio=0 tid=0x00007fad350f6000 nid=0x76ba runnable [0x00007facad6d1000]
170-   java.lang.Thread.State: RUNNABLE
171-    at com.shanjige.chatgpt.chatgptweb.web.IndexController.cpu(IndexController.java:64)
172-    at com.shanjige.chatgpt.chatgptweb.web.IndexController$$FastClassBySpringCGLIB$$db8434c4.invoke(<generated>)
173-    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
174-    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779)
175-    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
176-    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
177-    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
178-    at com.shanjige.chatgpt.chatgptweb.aop.ControllerAspect.aroundAdvice(ControllerAspect.java:71)
179-    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
180-    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
181-    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
182-    at java.lang.reflect.Method.invoke(Method.java:498)