日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

内存溢出_JVM|03内存溢出实战

發(fā)布時(shí)間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存溢出_JVM|03内存溢出实战 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)戰(zhàn) 內(nèi)存溢出定位與分析

環(huán)境搭建

/** * 模擬測(cè)試插入一百萬(wàn)條字符串[image.png](https://img.hacpai.com/file/2019/08/image-dd10de62.png) str += UUID.randomUUID().toString(); } list.add(str); } System.out.println("ok"); }}

結(jié)果:

java.lang.OutOfMemoryError: Java heap spaceDumping heap to java_pid10272.hprof ...Heap dump file created [8323049 bytes in 0.028 secs]Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3332)at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)at java.lang.StringBuilder.append(StringBuilder.java:136)at cn.jeff.test.Test01.main(Test01.java:18)Process finished with exit code 1

參數(shù)中設(shè)置了輸出dump文件,默認(rèn)輸出在項(xiàng)目根目錄下。

問(wèn)題分析(基于MAT):

可以看出87.93%的內(nèi)存被Object[]數(shù)組占用了,通常情況下不會(huì)出現(xiàn)這么高的占用
再去看詳細(xì)的數(shù)據(jù)情況:


可以看出在Object[]數(shù)組中裝滿了剛才生產(chǎn)的UUID,導(dǎo)致了最后的系統(tǒng)內(nèi)存溢出問(wèn)題。

分析線程執(zhí)行情況:jstack

線程知識(shí)回顧


線程的六種狀態(tài)

  • 初始態(tài)(NEW)
    創(chuàng)建一個(gè)Thread對(duì)象,但還未調(diào)用start()啟動(dòng)線程時(shí),線程處于初始態(tài)。

  • 運(yùn)行態(tài)(RUNNABLE),在Java中,運(yùn)行態(tài)包括 就緒態(tài) 和 運(yùn)行態(tài)。
    2.1 就緒態(tài) :
    該狀態(tài)下的線程已經(jīng)獲得執(zhí)行所需的所有資源,只要CPU分配執(zhí)行權(quán)就能運(yùn)
    行。
    所有就緒態(tài)的線程存放在就緒隊(duì)列中。
    2.2 運(yùn)行態(tài) :
    獲得CPU執(zhí)行權(quán),正在執(zhí)行的線程。
    由于一個(gè)CPU同一時(shí)刻只能執(zhí)行一條線程,因此每個(gè)CPU每個(gè)時(shí)刻只有一條
    運(yùn)行態(tài)的線程。

  • 阻塞態(tài)(BLOCKED)
    當(dāng)一條正在執(zhí)行的線程請(qǐng)求某一資源失敗時(shí),就會(huì)進(jìn)入阻塞態(tài)。
    而在Java中,阻塞態(tài)專指請(qǐng)求鎖失敗時(shí)進(jìn)入的狀態(tài)。
    由一個(gè)阻塞隊(duì)列存放所有阻塞態(tài)的線程。
    處于阻塞態(tài)的線程會(huì)不斷請(qǐng)求資源,一旦請(qǐng)求成功,就會(huì)進(jìn)入就緒隊(duì)列,等待執(zhí)
    行。

  • 等待態(tài)(WAITING)
    當(dāng)前線程中調(diào)用wait、join、park函數(shù)時(shí),當(dāng)前線程就會(huì)進(jìn)入等待態(tài)。
    也有一個(gè)等待隊(duì)列存放所有等待態(tài)的線程。
    線程處于等待態(tài)表示它需要等待其他線程的指示才能繼續(xù)運(yùn)行。進(jìn)入等待態(tài)的線程會(huì)釋放CPU執(zhí)行權(quán),并釋放資源(如:鎖)

  • 超時(shí)等待態(tài)(TIMED_WAITING)
    當(dāng)運(yùn)行中的線程調(diào)用sleep(time)、wait、join、parkNanos、parkUntil時(shí),就
    會(huì)進(jìn)入該狀態(tài);
    它和等待態(tài)一樣,并不是因?yàn)檎?qǐng)求不到資源,而是主動(dòng)進(jìn)入,并且進(jìn)入后需要其
    他線程喚醒;
    進(jìn)入該狀態(tài)后釋放CPU執(zhí)行權(quán) 和 占有的資源。
    與等待態(tài)的區(qū)別:到了超時(shí)時(shí)間后自動(dòng)進(jìn)入阻塞隊(duì)列,開(kāi)始競(jìng)爭(zhēng)鎖。

  • 終止態(tài)(TERMINATED)
    線程執(zhí)行結(jié)束后的狀態(tài)。

  • 實(shí)戰(zhàn):死鎖問(wèn)題

    構(gòu)建死鎖環(huán)境

    public class TestDeadLock { // 定義兩個(gè)鎖 private static Object obj1 = new Object(); private static Object obj2 = new Object(); public static void main(String[] args) {// 創(chuàng)建初始態(tài)線程 Thread thread1 = new Thread(new Thread1()); Thread thread2 = new Thread(new Thread2());// 就緒態(tài) thread1.start(); thread2.start(); } // 第一個(gè)線程 private static class Thread1 implements Runnable { @Override public void run() { synchronized (obj1) {// 此時(shí)得到了obj1這個(gè)鎖 System.out.println("Thread1得到了obj1這把鎖!"); try {// 停下來(lái)休息兩秒 為了讓Thread2得到obj2這把鎖 造成死鎖 sleep方法是不會(huì)釋放鎖的 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (obj2) { System.out.println("Thread1得到了obj2這把鎖!"); } } } } // 第二個(gè)線程 private static class Thread2 implements Runnable { @Override public void run() {// 得到obj2這把鎖 synchronized (obj2) { System.out.println("Thread2得到了obj2這把鎖!"); try {// 為了讓obj1被先得到 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }// 得到obj1 synchronized (obj1) { System.out.println("Thread2得到了obj1這把鎖!"); } } } }}

    結(jié)果

    [root@hadoop101 jvm]# javac TestDeadLock.java[root@hadoop101 jvm]# java TestDeadLockThread1得到了obj1這把鎖!Thread2得到了obj2這把鎖!# 程序卡在這里

    保持程序的運(yùn)行狀態(tài),另外創(chuàng)建一個(gè)xshell命令行窗口

    # 通過(guò)jps找到運(yùn)行的TestDeadLock程序的端口[root@hadoop101 ~]# jps2956 TestDeadLock3038 Jps1967 Bootstrap# 指令格式:jstack 端口號(hào)[root@hadoop101 ~]# jstack 29562019-08-16 02:43:12Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode):"Attach Listener" #11 daemon prio=9 os_prio=0 tid=0x00007ffa54001000 nid=0xbf4 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"DestroyJavaVM" #10 prio=5 os_prio=0 tid=0x00007ffa7c008800 nid=0xb8d waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"Thread-1" #9 prio=5 os_prio=0 tid=0x00007ffa7c0ca800 nid=0xb97 waiting for monitor entry [0x00007ffa6c51d000] java.lang.Thread.State: BLOCKED (on object monitor)at TestDeadLock$Thread2.run(TestDeadLock.java:52)- waiting to lock <0x00000000e345be78> (a java.lang.Object)- locked <0x00000000e345be88> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)"Thread-0" #8 prio=5 os_prio=0 tid=0x00007ffa7c0c9000 nid=0xb96 waiting for monitor entry [0x00007ffa6c61e000] java.lang.Thread.State: BLOCKED (on object monitor)at TestDeadLock$Thread1.run(TestDeadLock.java:31)- waiting to lock <0x00000000e345be88> (a java.lang.Object)- locked <0x00000000e345be78> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007ffa7c0b3000 nid=0xb94 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007ffa7c0b0000 nid=0xb93 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007ffa7c0ad800 nid=0xb92 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007ffa7c0ac000 nid=0xb91 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007ffa7c079000 nid=0xb90 in Object.wait() [0x00007ffa6cc24000] java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000e3408e98> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)- locked <0x00000000e3408e98> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007ffa7c074800 nid=0xb8f in Object.wait() [0x00007ffa6cd25000] java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000e3406b40> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:502)at java.lang.ref.Reference.tryHandlePending(Reference.java:191)- locked <0x00000000e3406b40> (a java.lang.ref.Reference$Lock)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)"VM Thread" os_prio=0 tid=0x00007ffa7c06d000 nid=0xb8e runnable"VM Periodic Task Thread" os_prio=0 tid=0x00007ffa7c0b6000 nid=0xb95 waiting on conditionJNI global references: 6Found one Java-level deadlock:============================="Thread-1": waiting to lock monitor 0x00007ffa600062c8 (object 0x00000000e345be78, a java.lang.Object), which is held by "Thread-0""Thread-0": waiting to lock monitor 0x00007ffa60004e28 (object 0x00000000e345be88, a java.lang.Object), which is held by "Thread-1"Java stack information for the threads listed above:==================================================="Thread-1":at TestDeadLock$Thread2.run(TestDeadLock.java:52)- waiting to lock <0x00000000e345be78> (a java.lang.Object)- locked <0x00000000e345be88> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)"Thread-0":at TestDeadLock$Thread1.run(TestDeadLock.java:31)- waiting to lock <0x00000000e345be88> (a java.lang.Object)- locked <0x00000000e345be78> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)# 系統(tǒng)提示發(fā)現(xiàn)一個(gè)死鎖Found 1 deadlock.

    死鎖分析:

    "Thread-1" #9 prio=5 os_prio=0 tid=0x00007ffa7c0ca800 nid=0xb97 waiting for monitor entry [0x00007ffa6c51d000] java.lang.Thread.State: BLOCKED (on object monitor)at TestDeadLock$Thread2.run(TestDeadLock.java:52)- waiting to lock <0x00000000e345be78> (a java.lang.Object)- locked <0x00000000e345be88> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)"Thread-0" #8 prio=5 os_prio=0 tid=0x00007ffa7c0c9000 nid=0xb96 waiting for monitor entry [0x00007ffa6c61e000] java.lang.Thread.State: BLOCKED (on object monitor)at TestDeadLock$Thread1.run(TestDeadLock.java:31)- waiting to lock <0x00000000e345be88> (a java.lang.Object)- locked <0x00000000e345be78> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)

    可以看出:
    Thread-1:正在手握著0x00000000e345be88這個(gè)鎖,等待著0x00000000e345be78的獲取;
    Thread-0:正在手握著0x00000000e345be78這個(gè)鎖,等待著0x00000000e345be88的獲取;

    VisualVM工具的使用

    簡(jiǎn)介

    VisualVM,能夠監(jiān)控線程,內(nèi)存情況,查看方法的CPU時(shí)間和內(nèi)存中的對(duì) 象,已被GC的對(duì)象,反向查看分配的堆棧(如100個(gè)String對(duì)象分別由哪幾個(gè)對(duì)象分配出來(lái)的)。
    VisualVM使用簡(jiǎn)單,幾乎0配置,功能還是比較豐富的,幾乎囊括了其它JDK自帶命令的所有功能。
    1、內(nèi)存信息
    2、線程信息
    3、Dump堆(本地進(jìn)程)
    4、Dump線程(本地進(jìn)程)
    5、打開(kāi)堆Dump。堆Dump可以用jmap來(lái)生成。
    6、打開(kāi)線程Dump
    7、生成應(yīng)用快照(包含內(nèi)存信息、線程信息等等)
    8、性能分析。
    9、CPU分析(各個(gè)方法調(diào)用時(shí)間,檢查哪些方法耗時(shí)多)
    10、內(nèi)存分析(各類對(duì)象占用的內(nèi)存,檢查哪些類占用內(nèi)存多

    使用方法

    啟動(dòng)

    VisualVM在jdk的安裝目錄的bin下面有jvisualvm.exe,打開(kāi)便可使用。

    與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的内存溢出_JVM|03内存溢出实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产无毛av | 最新三级网站 | 欧美精品少妇 | 婷婷久久综合网 | 思思久久久 | 久久亚洲精品视频 | 一线毛片 | 亚洲综合免费观看高清完整版在线 | 男人懂得网站 | 在线看黄色的网站 | 国产日韩欧美综合 | 伊人久久影视 | 一个色在线视频 | 他揉捏她两乳不停呻吟动态图 | 黄色在线观看免费视频 | 日韩高清中文字幕 | 久久国内精品 | 欧美在线另类 | 国产一区二区免费电影 | 四虎精品一区 | 色多多污污 | 免费污污视频在线观看 | 国产精品久久久久国产a级 国产一区二区在线播放 | 欧美极品喷水 | 在线看三级 | 亚洲gay视频 | 正在播放一区 | 日本美女黄视频 | 天堂俺去俺来也www久久婷婷 | 久久高清内射无套 | 七七久久 | 1024视频在线 | av男女 | 亚洲最大视频网 | 日韩在线国产精品 | 欧美日韩精品在线视频 | 高h全肉污文play带道具 | 黄页网站视频 | 高h在线观看 | 五月天在线播放 | 日本啪啪网站 | 亚州一区二区 | 女人私密又肥又大 | 国产精品毛片一区视频播 | 成人免费视频一区二区三区 | 岛国一区二区三区 | 欧美毛片网站 | 日本人妻丰满熟妇久久久久久 | 中文字幕国产一区 | 亚洲啪啪免费视频 | 日本在线看 | 国产一区二区三区中文字幕 | 亚洲视频精品在线观看 | 国产乱人伦精品一区二区 | 国产精品久久久久影院老司 | 成人免费视频一区 | 欧美精品久久久久久 | chinese精品自拍hd| 精品久久久网站 | 国产性生活| 国产乱国产 | 97久久人国产精品婷婷 | 国产玖玖| 自拍偷拍日韩精品 | 激情区| 国产又爽又猛又粗的视频a片 | 亚洲av女人18毛片水真多 | 男人操女人的视频 | 日本久久久久久久久久 | 小色瓷导航 | 亚洲婷婷在线观看 | 欧美精品中文 | 怡红院一区二区 | 久久精品牌麻豆国产大山 | 久久国内偷拍 | 免费激情网 | 91av视频在线观看 | 岛国av一区二区三区 | 国产精品熟妇人妻g奶一区 a少妇 | 91久久人澡人人添人人爽欧美 | 丰满放荡岳乱妇91ww | 波多野结衣家庭主妇 | 岛国av大片| 精品人伦一区二区三区蜜桃网站 | yjizz视频| 亚洲国产精品午夜久久久 | 天天操天天弄 | 国语对白一区二区三区 | 九九视频在线观看 | 欧美国产日韩一区 | 久久高清av | 国产精品人人妻人人爽 | 熟妇大屁股一区二区三区视频 | 白嫩情侣偷拍呻吟刺激 | 日韩在线欧美在线 | 亚洲欧美va天堂人熟伦 | 免费不卡av在线 | 欧美成年人在线视频 | 日本熟妇毛茸茸丰满 |