写一个模拟的占用高的代码
public class HighCpuUsageSimulation {
public static void main(String[] args) {
// 创建一个模拟高CPU使用的线程
Thread highCpuThread = new Thread(() -> {
try {
// 无限循环
while (true) {
// 模拟一个耗时操作
Thread.sleep(100); // 睡眠100毫秒
performHeavyComputation(); // 执行一个模拟的高CPU使用率的方法
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重置中断状态
}
});
// 启动线程
highCpuThread.start();
// 为了演示,让主线程睡眠一会儿,然后中断线程
try {
Thread.sleep(5000); // 主线程睡眠5秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 中断模拟高CPU使用的线程
highCpuThread.interrupt();
}
private static void performHeavyComputation() {
// 模拟一个复杂的计算,这里我们只是简单地进行大循环
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
// 这里可以添加一些计算逻辑
System.out.println("dsdfsdsdg");
}
}
}
}
CPU占用过高
1 找到占用高的java进程
top
2 找到对应的线程
top -Hp 进程号
3 将获取到的线程号转换成16进制
printf "%x\n" 线程号
4 使用jstack打印出当前线程的信息
jstack 进程号 | grep -20 线程16进制
jstack 13 | grep -20 30
5 使用jstack 将线程信息输出到文本
jstack -l 进程号 >> jstack.log
如
jstack -l 13 >> jstack_1.log
内存占用过高
方法1 可提前设置 ,程序堆溢出时,自动导出堆信息到文件
nohup java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/heap.hprof -jar t1.jar &
方法2 进程没挂时,可用命令,导出Java进程的堆信息
jmap -dump:format=b,file=heap_dump.hprof 进程id
如
jmap -dump:format=b,file=heap_dump.hprof 13
接下来可用 `jvisualvm`是一个可视化工具,可以用来分析Java进程的性能,包括线程和堆的情况。
导入 上面的 hprof 文件