最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM內(nèi)存與CPU占用過高問題定位及解決

 更新時(shí)間:2026年01月13日 08:38:33   作者:techzhi  
文章介紹了一種通過排查思路定位Java程序中CPU和內(nèi)存占用過高的問題的方法,通過運(yùn)行一個(gè)模擬無限添加byte[]的代碼,使用top命令查看進(jìn)程占用情況,然后通過查看線程列表和輸出堆棧信息,最終定位到具體的代碼方法

前言

如果開發(fā)過程中代碼存在不規(guī)范漏洞,Java程序在運(yùn)行時(shí)就很有可能會(huì)出現(xiàn):內(nèi)存(溢出、泄漏)、CPU占用過高。

本篇文章將通過一個(gè)簡(jiǎn)單的例子給大家演示一下,如果線上出現(xiàn)以上問題我們可以如何精準(zhǔn)定位到代碼上的問題。

排查思路:進(jìn)程->線程->代碼->類->方法

一、示例代碼

模擬一個(gè)線程往一個(gè)集合List<byte[]> list中無限循環(huán)添加byte[],這樣就可以有效的觀察到j(luò)ava進(jìn)程運(yùn)行時(shí)會(huì)出現(xiàn)CPU、內(nèi)存占用過高的場(chǎng)景。然后給當(dāng)前運(yùn)行的線程自定一個(gè)線程名稱,便于后續(xù)問題排查。

package com.nb.java;

import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class JavaBasisApplication {
	public static void main(String[] args) {
		// 定義一個(gè)list
		List<byte[]> list = new ArrayList<>();
        // 創(chuàng)建一個(gè)線程,并且自定義這個(gè)線程的名稱:模擬Java運(yùn)行時(shí)CPU、內(nèi)存占用過高的線程
		new Thread(() -> {
			while (true){ 
				System.out.println("===每次添加一個(gè)byte[10]字節(jié)數(shù)組===");
				list.add(new byte[10]);
			}
		},"模擬Java運(yùn)行時(shí)CPU、內(nèi)存占用過高的線程").start();
	}
}

二、運(yùn)行代碼

1、將上面的類基于SpringBoot打包成一個(gè)jar包,隨便放到一個(gè)服務(wù)器運(yùn)行。

執(zhí)行以下命令:

nohup java -jar java.jar > test.log 2>&1 &

2、查詢當(dāng)前運(yùn)行的java程序進(jìn)程PID:882245

jps -l

三、top命令

  • CPU=262.4%
  • MEM=5.3%

通過top命令可以發(fā)現(xiàn)882245這個(gè)進(jìn)程(也就是我們運(yùn)行的這個(gè)java程序)占用的CPU和內(nèi)存相對(duì)來說都是比較高的。

四、問題定位

1、查看java進(jìn)程所有的線程列表

top -p 882245 -H

從這個(gè)圖可以看出我們運(yùn)行的java程序里出現(xiàn)了882292線程占用CPU、內(nèi)存過高。到這里我們就成功了一半。至少看到了是那個(gè)線程出現(xiàn)的問題。

2、輸出線程882292十六進(jìn)制

printf "%x\n" 882292

d7674(882292的十六進(jìn)制的值,用于后面查看線程堆棧中的關(guān)鍵字檢索)

五、輸出java堆棧信息

注意:這里的882245是進(jìn)程ID,不是線程ID。

jstack 882245 > pid_882245_dump.txt 

在當(dāng)前目錄會(huì)生成一個(gè)pid_882245_dump.txt 文件。

六、pid_882245_dump.txt

cat pid_882245_dump.txt | grep d7674 -B 30 

這里的(d7674)就是第四部生成的。

root@yiliao:~# cat pid_882245_dump.txt | grep d7674 -A 30 
"模擬Java運(yùn)行時(shí)CPU、內(nèi)存占用過高的線程" #31 prio=5 os_prio=0 cpu=1117037.88ms elapsed=1168.34s tid=0x00007efd81e31000 nid=0xd7674 runnable  [0x00007efd1c327000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileOutputStream.writeBytes(java.base@11.0.19/Native Method)
	at java.io.FileOutputStream.write(java.base@11.0.19/FileOutputStream.java:354)
	at java.io.BufferedOutputStream.flushBuffer(java.base@11.0.19/BufferedOutputStream.java:81)
	at java.io.BufferedOutputStream.flush(java.base@11.0.19/BufferedOutputStream.java:142)
	- locked <0x0000000413bcfa60> (a java.io.BufferedOutputStream)
	at java.io.PrintStream.write(java.base@11.0.19/PrintStream.java:561)
	- locked <0x00000004119f6828> (a java.io.PrintStream)
	at sun.nio.cs.StreamEncoder.writeBytes(java.base@11.0.19/StreamEncoder.java:233)
	at sun.nio.cs.StreamEncoder.implFlushBuffer(java.base@11.0.19/StreamEncoder.java:312)
	at sun.nio.cs.StreamEncoder.flushBuffer(java.base@11.0.19/StreamEncoder.java:104)
	- locked <0x00000004119f67e0> (a java.io.OutputStreamWriter)
	at java.io.OutputStreamWriter.flushBuffer(java.base@11.0.19/OutputStreamWriter.java:181)
	at java.io.PrintStream.write(java.base@11.0.19/PrintStream.java:606)
	- eliminated <0x00000004119f6828> (a java.io.PrintStream)
	at java.io.PrintStream.print(java.base@11.0.19/PrintStream.java:745)
	at java.io.PrintStream.println(java.base@11.0.19/PrintStream.java:882)
	- locked <0x00000004119f6828> (a java.io.PrintStream)
	at com.nb.java.JavaBasisApplication.lambda$main$0(JavaBasisApplication.java:30)
	at com.nb.java.JavaBasisApplication$$Lambda$634/0x00000008403d2c40.run(Unknown Source)
	at java.lang.Thread.run(java.base@11.0.19/Thread.java:829)

"DestroyJavaVM" #32 prio=5 os_prio=0 cpu=2896.41ms elapsed=1168.34s tid=0x00007efd80015000 nid=0xd7646 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #33 daemon prio=9 os_prio=0 cpu=1.12ms elapsed=18.83s tid=0x00007efd18001000 nid=0xd76d7 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=781.96ms elapsed=1171.43s tid=0x00007efd802a6000 nid=0xd764c runnable

從圖上下面的剪頭指向就很寫清楚定位到:com.nb.java.JavaBasisApplication#main方法有問題。這樣就定位到我們的具體代碼。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot中請(qǐng)求路徑配置在配置文件中詳解

    springboot中請(qǐng)求路徑配置在配置文件中詳解

    這篇文章主要介紹了springboot中請(qǐng)求路徑配置在配置文件中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 關(guān)于Spring啟動(dòng)流程及Bean生命周期梳理

    關(guān)于Spring啟動(dòng)流程及Bean生命周期梳理

    這篇文章主要介紹了關(guān)于Spring啟動(dòng)流程及Bean生命周期梳理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JavaWeb亂碼問題的終極解決方案(推薦)

    JavaWeb亂碼問題的終極解決方案(推薦)

    這篇文章主要給大家介紹了關(guān)于JavaWeb亂碼問題的終極解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaWeb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring?Boot的優(yōu)點(diǎn)及項(xiàng)目創(chuàng)建步驟詳解

    Spring?Boot的優(yōu)點(diǎn)及項(xiàng)目創(chuàng)建步驟詳解

    這篇文章主要介紹了Spring?Boot的優(yōu)點(diǎn)及項(xiàng)目創(chuàng)建步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Response如何實(shí)現(xiàn)重定向

    Response如何實(shí)現(xiàn)重定向

    這篇文章主要介紹了Response如何實(shí)現(xiàn)重定向方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java制作仿微信錄制小視頻控件

    java制作仿微信錄制小視頻控件

    這篇文章主要介紹了java制作仿微信錄制小視頻控件的代碼,錄制小視頻非常方便,有需要的小伙伴可以參考下。
    2015-04-04
  • Spring中Bean的創(chuàng)建流程詳細(xì)解讀

    Spring中Bean的創(chuàng)建流程詳細(xì)解讀

    這篇文章主要介紹了Spring中Bean的創(chuàng)建流程詳細(xì)解讀,Spring 中創(chuàng)建 Bean ,是通過調(diào)用 GetBean 方法來觸發(fā)的,所以,我們會(huì)從這個(gè)方法開始,需要的朋友可以參考下
    2023-10-10
  • Java 字符數(shù)組轉(zhuǎn)字符串的常用方法

    Java 字符數(shù)組轉(zhuǎn)字符串的常用方法

    文章總結(jié)了在Java中將字符數(shù)組轉(zhuǎn)換為字符串的幾種常用方法,包括使用String構(gòu)造函數(shù)、String.valueOf()方法、StringBuilder以及Arrays.toString()方法,每種方法都有其適用的場(chǎng)景和性能特點(diǎn),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Maven的安裝和環(huán)境變量配置過程

    Maven的安裝和環(huán)境變量配置過程

    文章介紹了如何下載、安裝和配置Maven,包括環(huán)境變量配置和阿里云鏡像的可選配置,此外,還展示了如何在IntelliJ IDEA中新建一個(gè)Maven項(xiàng)目
    2024-11-11
  • SpringBoot中ApplicationEvent的使用步驟詳解

    SpringBoot中ApplicationEvent的使用步驟詳解

    ApplicationEvent類似于MQ,是Spring提供的一種發(fā)布訂閱模式的事件處理方式,本文給大家介紹SpringBoot中ApplicationEvent的使用步驟詳解,感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評(píng)論

阳朔县| 乃东县| 雷州市| 峡江县| 浦东新区| 民乐县| 万源市| 瓮安县| 涞水县| 上犹县| 喀什市| 古田县| 中阳县| 宁都县| 辰溪县| 宁陕县| 沧源| 太康县| 扎鲁特旗| 泰兴市| 夏河县| 楚雄市| 长沙县| 象州县| 昌都县| 贵州省| 永福县| 富川| 黑龙江省| 环江| 新津县| 大丰市| 西城区| 吴川市| 阿合奇县| 石景山区| 紫金县| 蛟河市| 黔江区| 察隅县| 扶余县|