首页 > 系统相关 >JAVA 调试高内存占用与CPU满载异常场景

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

时间:2023-07-05 15:34:48浏览次数:47  
标签:java Thread util concurrent 内存 org JAVA CPU ThreadPoolExecutor

高内存占用,堆溢出,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)

标签:java,Thread,util,concurrent,内存,org,JAVA,CPU,ThreadPoolExecutor
From: https://www.cnblogs.com/hongdada/p/17528666.html

相关文章

  • java常见面试题分析及答案
    new一个object对象占多少字节对象头加实例数据16个字节java反射的优缺点Java反射的优点1.增加程序的灵活性,避免将程序写死到代码里2.代码简洁,提高代码的复用率,外部调用方便3.对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法Java反射......
  • Java批量操作Excel文件实践
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言|问题背景在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的意思一般有两种:对批量的Excel文件进行操作。如导入多个Excel......
  • JavaScript
    JS变量//varletconstvar:很少使用,全局作用域let:值可以被修改const:值不能被修改,而且需要在声明时初始化数值console.log('helloworld') //这是我的第一个js代码;letbbb//声明bbb=30//赋值bbb=31//修改console.log(bbb)......
  • java的可选链Optional
    Optional是Jdk1.8提供的一个新类,用以解决null判断问题,作用类似于JavaScript中的可选链例如如下场景:privatevoidgetIsoCode(Useruser){if(user!=null){Addressaddress=user.getAddress();if(address!=null){Countrycount......
  • java 中协变,逆变,不变简单理解
    1.什么是协变、逆变、不变假设有两个类,Dog和Animal,如果用Dog<=Animal表示它俩的继承关系。用f(type)表示类型构造器,一个已知的类型被类型构造器处理后就是一个崭新的类型。协变就是f(Dog)是f(Animal)的子类,即f(Dog)<=f(Animal);逆变就是f(Animal)是f(Dog)的子类,即f(Ani......
  • [llama懒人包]ChatGPT本地下位替代llama-7b,支持全平台显卡/CPU运行
    LLAMA的懒人包:链接:https://pan.baidu.com/s/1xOw8-eP8QB--u6y644_UPg?pwd=0l08 提取码:0l08模型来源:elinas/llama-7b-hf-transformers-4.29模型来源(LoRA):ymcui/Chinese-LLaMA-Alpaca侵权请通知作者删除也可以进我的群下载哦:904511841下面是llama的输入样例 >自......
  • JAVA设计模式之建造者模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 单线程JavaScript为何如此高效
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址什么是js执行机制JavaScript的执行机制指的是JavaScript代码在运行时的工作方式和顺序。它涉及以下几个关键概念:单线程:JavaScript是一门单线程的编程语言,意味着它只有一个主线程用于执行代码。这意味着JavaScrip......
  • java双冒号写法(Lambda的简写)
    类似这种Person::getName,双冒号写法,是Java8对Lambda表达式的简写常见的简写场景有以下是Java8中方法引用的一些语法:静态方法引用(staticmethod)语法:classname::methodname例如:Person::getAge对象的实例方法引用语法:instance::methodname例如:System.out::println对象的超类方......
  • 面向对象(java)
    一、定义 二、注意事项:一个java文件中最好只写一个类;  三、封装(1)对象代表什么,就得封装对应的数据,并提供数据对应的行为;(2)如果加了static,就是类的变量(类共享),而不是实例变量了;......