Java線程:保留的內存分析

本文將為您提供一個教程,使您可以確定活動應用程序Java線程保留Java堆空間的數量和位置。 將提供來自Oracle Weblogic 10.0生產環境的真實案例研究,以使您更好地理解分析過程。

我們還將嘗試證明過多的垃圾回收或Java堆空間的內存占用問題通常不是由真正的內存泄漏引起的,而是由線程執行模式和大量的短期對象引起的。

背景

您可能從我過去的JVM概述文章中看到,Java線程是JVM基礎的一部分。 您的Java堆空間內存占用量不僅受靜態對象和壽命長的對象的驅動,還受壽命短的對象的驅動。

通常會錯誤地認為OutOfMemoryError問題是由于內存泄漏引起的。 我們經常忽略錯誤的線程執行模式和它們在Java堆上“保留”到執行完成的短暫對象。 在這種有問題的情況下:

  • 您的“預期”應用程序的短期/無狀態對象(XML,JSON數據有效載荷等)被線程保留的時間過長(線程鎖爭用,巨大的數據有效載荷,來自遠程系統的響應時間慢等)。
  • 最終,這樣的短期對象被垃圾收集器提升為長期對象空間,例如OldGen / tenured空間
  • 副作用是,這導致OldGen空間快速填充,從而增加了Full GC(主要集合)的頻率
  • 根據情況的嚴重性,這可能導致過度的GC垃圾收集,JVM暫停時間增加,并最終導致OutOfMemoryError:Java堆空間
  • 您的應用程序現在關閉,您現在對正在發生的事情感到困惑
  • 最后,您正在考慮增加Java堆或尋找內存泄漏……您是否真的走對了?

在上述情況下,您需要查看線程執行模式,并確定它們在給定時間保留多少內存。

好了,我得到了圖片,但是線程堆棧的大小呢?

避免線程堆棧大小和Java內存保留之間的混淆是非常重要的。 線程堆棧大小是JVM用于存儲每個方法調用的特殊內存空間。 當線程調用方法A時,它將調用“推”到堆棧上。 如果方法A調用方法B,它也會被壓入堆棧。 一旦方法執行完成,調用便從堆棧中“彈出”。

由于此類線程方法調用而創建的Java對象在Java堆空間上分配。 絕對增加線程堆棧大小不會有任何效果。 處理java.lang.stackoverflowerror或OutOfMemoryError:無法創建新的本機線程問題時,通常需要調整線程堆棧的大小。

案例研究和問題背景

以下分析基于我們最近調查的真實生產問題。

  • 在用戶Web界面進行了一些更改(使用Google Web Toolkit和JSON作為數據有效負載)之后,從Weblogic 10.0生產環境中觀察到嚴重的性能下降。
  • 初步分析確實揭示了OutOfMemoryError的幾種情況:Java堆空間錯誤以及過多的垃圾回收。 在發生OOM事件后,會自動生成Java堆轉儲文件(-XX:+ HeapDumpOnOutOfMemoryError)
  • 對詳細:gc日志的分析確實確認了32位HotSpot JVM OldGen空間(1 GB容量)的完全耗盡
  • 在問題發生之前和過程中也生成了線程轉儲快照
  • 當時唯一可以解決的問題是觀察到問題時重新啟動受影響的Weblogic服務器
  • 最終對變更進行了回滾,這確實解決了這種情況

團隊首先從引入的新代碼中懷疑了內存泄漏問題。

線程轉儲分析:尋找可疑對象…

我們所做的第一步是對生成的線程轉儲數據進行分析。 線程轉儲通常會向您顯示在Java堆上分配內存的罪魁禍首線程。 它還將揭示試圖從遠程系統發送和接收數據有效載荷的任何占用線程或阻塞線程。

我們注意到的第一個模式是從Weblogic托管服務器(JVM進程)觀察到的OOM事件和STUCK線程之間具有良好的相關性。 在找到的主線程模式下面找到:

<10-Dec-2012 1:27:59 o'clock PM EST> <Error> <BEA-000337><[STUCK] ExecuteThread: '22' for queue:'weblogic.kernel.Default (self-tuning)'has been busy for '672' seconds working on the requestwhich is more than the configured time of '600' seconds.

如您所見,以上線程似乎是STUCK或花費很長時間讀取和接收來自遠程服務器的JSON響應。 一旦找到該模式,下一步就是將該發現與JVM堆轉儲分析相關聯,并確定這些卡住的線程從Java堆中占用了多少內存。

堆轉儲分析:保留的對象暴露在外!

Java堆轉儲分析是使用MAT執行的。 現在,我們將列出不同的分析步驟,這些步驟確實使我們可以查明保留的內存大小和源。

1.加載HotSpot JVM堆轉儲

2.選擇HISTOGRAM視圖并按“ ExecuteThread”進行過濾

* ExecuteThread是Weblogic內核用于線程創建和執行的Java類*

如您所見,這種觀點非常明顯。 我們可以看到總共創建了210個Weblogic線程。 這些線程保留的內存總量為806 MB。 這對于具有1 GB OldGen空間的32位JVM進程而言非常重要。 僅此觀點就告訴我們問題的核心和內存保留源于線程本身。

3.深入研究線程內存占用量分析

下一步是深入研究線程內存保留。 為此,只需右鍵單擊ExecuteThread類,然后選擇:列表對象>帶有傳出引用。

如您所見,我們能夠將線程轉儲分析中的STUCK線程與堆轉儲分析中的高內存保留量相關聯。 這個發現非常令人驚訝。

4.線程Java局部變量識別

最后的分析步驟確實需要我們擴展一些線程示例并了解內存保留的主要來源。

如您所見,這最后一個分析步驟確實從根本原因上揭示了巨大的JSON響應數據有效載荷。 該模式還通過線程轉儲分析在早期公開,我們發現一些線程需要很長時間才能讀取和接收JSON響應。 數據有效負載占用量巨大的明顯癥狀。

至關重要的是要注意,通過局部方法變量創建的短期對象顯示在堆轉儲分析中。 但是,其中一些將僅在其父線程中可見,因為這種情況下其他對象未引用它們。 您還需要分析線程堆棧跟蹤以識別真正的調用者,然后進行代碼檢查以確認根本原因。

根據這一發現,在某些情況下,我們的交付團隊能夠確定最近的JSON錯誤代碼更改正在生成高達45 MB +的巨大JSON數據有效負載。 考慮到該環境使用的是只有1 GB OldGen空間的32位JVM,您可以理解,只有幾個線程足以觸發嚴重的性能下降。

該案例研究清楚地表明了適當的容量規劃和Java堆分析的重要性,包括從活動應用程序和Java EE容器線程中保留的內存。

其他一切都只是信息

我希望本文能幫助您了解如何通過結合線程轉儲和堆轉儲分析來確定活動線程保留的Java堆內存占用量。 現在,如果您不嘗試的話,本文將僅停留在文字上,因此,我強烈建議您花一些時間自己學習針對您的應用程序進行的分析過程。

參考: Java Thread:保留了我們的JCG合作伙伴 Pierre-Hugues Charbonneau在Java EE支持模式和Java教程博客上進行的內存分析 。

翻譯自: https://www.javacodegeeks.com/2012/12/java-thread-retained-memory-analysis.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件測試白皮書-等價類

設有一個檔案管理系統&#xff0c;要求用戶輸入以年月表示的日期。假設日期限定在1990年1月~2049年12月&#xff0c;并規定日期由6位數字字符組成&#xff0c;前4位表示年&#xff0c;后2位表示月。現用等價類劃分法設計測試用例&#xff0c;來測試程序的"日期檢查功能&qu…

深入css布局 (1) — 盒模型 元素分類

深入css布局&#xff08;1&#xff09;—— 盒模型 & 元素分類 “ 在css知識體系中&#xff0c;除了css選擇器&#xff0c;樣式屬性等基礎知識外&#xff0c;css布局相關的知識才是css比較核心和重要的點。今天我們來深入學習一下css布局相關的知識。” 首先來列下大綱 盒模…

批改網禁止粘貼怎么破_教育部對家長批改作業表態了,明令禁止!你怎么看?...

互聯網的發展&#xff0c;的確方便了現代人生活。視頻電話、出去買東西你都不用帶錢帶卡&#xff0c;手機一掃就可以完成支付。很多中小學的家長都會建一個家長群&#xff0c;方便老師和家長的溝通。這個群可以說是家長和學校的橋梁和紐帶&#xff0c;家長們為了支持老師的工作…

電子科大專科c語言作業1,電子科大15春《C語言(專科)》在線作業試卷.docx

電子科大 15 春《 C 語言(專科)》在線作業一、單選題(共20 道試題&#xff0c;共100 分。)1.對于 int*p;inta[];pa;的合法運算 ()a;pa;p; 相當于 a;p; 相當于 a[1];若 p 中的地址為 100 則 p; 運算后&#xff0c;則其值為 100-----------------選擇&#xff1a; C已知 intb; 則…

MapReduce算法–順序反轉

這篇文章是介紹MapReduce算法的系列文章的另一部分&#xff0c;該書在使用MapReduce進行數據密集型文本處理中找到。 先前的文章是Local Aggregation &#xff0c; Local Aggregation PartII和創建共現矩陣 。 這次我們將討論階數反轉模式。 順序反轉模式利用的MapReduce來計算…

xss防御

http://blog.csdn.net/ghsau/article/details/17027893轉載于:https://www.cnblogs.com/jiangjing/p/8076216.html

移動端頁面字體在微信被放大,導致排版錯亂

在開發微信頁面的時候&#xff0c;之前一直沒有測出這個問題。直到某天領導的手機出現了排版錯位的問題&#xff0c;拿著手機質問我的工作態度。 Google了一下發現原來微信調整了字體大小會放大網頁的字體&#xff0c;導致排版混亂。通過設置可以禁止網頁字體被放大&#xff1a…

液壓支架銷軸力學計算分析研究_基于RFID射頻精準定位的智能開采研究與應用...

一、項目背景近年來隨著智能開采技術的不斷發展&#xff0c;裝備和新工藝不斷更新換代,在智能開采中&#xff0c;對采煤機位置的精準定位是能否實現智能開采的關鍵&#xff0c;只有準確無誤地獲取煤機的準確位置&#xff0c;才能實現工作面的智能化開采&#xff0c;進而提高生產…

cf 821E Okabe and El Psy Kongroo(矩陣快速冪)

鏈接&#xff1a;http://codeforces.com/problemset/problem/821/E 分析&#xff1a;由于有邊界而且不同段邊界還不同&#xff0c;直接算是不行的。。k是1e18&#xff0c;dp也不行。。用一個16維的向量表示某一列16個位置可能的種類數&#xff0c;到下一列的轉移矩陣容易得到&a…

您是否能及時編譯?

還記得上次被C開發人員嘲笑的時候嗎&#xff1f; Java如此繁瑣&#xff0c;以至于他們甚至都不會考慮使用這種語言&#xff1f; 在許多方面&#xff0c;這一概念仍然成立。 但是對于典型的用法&#xff08;在大型企業的骨干中&#xff09;&#xff0c;Java性能絕對可以與許多競…

C語言作業二選擇結構,C語言第二次作業參考答案選擇結構.pdf

1 C 語言第二次作業(選擇結構)參考答案語言第二次作業(選擇結構)參考答案 1、某年如果能被某年如果能被 4 整除整除&#xff0c;&#xff0c;但不能被但不能被 100 整除整除&#xff0c;&#xff0c;或者能被或者能被 400 整除的整除的 年是閏年。判斷從鍵盤輸入的年份是否為閏…

2d物理引擎01

我一直想做一個游戲&#xff0c;但一直感覺自己水平不夠 想了想覺得不去做的話就永遠做不出來 所以有了這個博文 01 我需要一個東西來顯示&#xff0c;很顯然h5中canvas是很好的選擇 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

python結課設計力學方面_我對力學教案的評價

這是來自某教學網站的高一物理力學教案&#xff1a;[高一物理教案1.1.1]第一章 力1&#xff0e;1 力一、教學目標1&#xff0e;知識目標⑴知道力是物體對物體的作用&#xff0c;力不能脫離物體而存在&#xff1b;能正確找出受力物體和施力物體。⑵知道力是有方向的量&#xff…

Liferay Model Hints

這篇文章主要介紹如何通過model hint 來修改liferay builder service生成數據庫表中默認字段的長度。 1.什么是Model Hints? 它是對liferay builder service生成的model類的基本提示. 2. 它在什么地方被定義的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

瀏覽器書簽備份管理

1、火狐瀏覽器備份導出HTML文件&#xff1a; CtrlJ 書簽 - 導入/導出 2、谷歌瀏覽器&#xff1a; 設置中 導入書簽 轉載于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

選擇您的收藏庫

這真的是您應該煩惱的嗎&#xff1f; java.util.ArrayList和java.util.HashMap從根本上有問題嗎&#xff1f; 對于大多數源代碼&#xff0c;答案是–不&#xff1b; 這些實現完全可以。 但是&#xff0c;一如既往&#xff0c;細節決定成敗。 并存在情況下&#xff0c;當是內置…

里公式后面標號怎么對齊_你若會用Word里F4鍵,又何須加班到半夜?

F4鍵在Word里面表示重復上一個操作&#xff0c;但對于這個快捷鍵&#xff0c;你真的會操作嗎&#xff1f;本期與大家分享這個神奇的F4鍵&#xff0c;助你高效工作。1、批量復制文本在一般情況下&#xff0c;我們是用CtrlC復制內容&#xff0c;CtrlV粘貼內容&#xff0c;但遇到特…

全方位分析web前端如何進行性能優化

前言&#xff1a; 最近剛剛完成項目&#xff0c;空閑一段時間&#xff0c;想起之前有被問起怎么對前端進行性能優化&#xff0c;自己也是腦中零零散散的總不成體系&#xff0c;現特來總結&#xff0c;歡迎補充指教。 1、整體資源 &#xff08;1&#xff09;js、css源碼壓縮 &a…

DshanMCU-R128s2 SDK 架構與目錄結構

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核異構 SoC&#xff0c;同時芯片內部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文檔作為 R128 FreeRTOS SDK 開發指南&#xff0c;旨在幫助軟件開發工程師、技術支持工程師快速上手&am…

數據導出

數據導出和數據導入剛好是相反的&#xff0c;把邏輯反過來就可以了。 源碼&#xff1a;https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/COM/DataToOut.aspx 效果&#xff1a; 然后勾選需要導出的數據&#xff0c;生成Excel 部分前臺&#xff1a;…