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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool

發布時間:2024/1/23 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀文本大概需要3分鐘。

一個大型的Java項目也許從開發到測試結束并可能不能未發現一些重大的問題,但是在生產環境中還是會出現一些非常棘手的問題,如內存泄漏直接導致服務宕機,遇到這樣的問題對于一個經驗尚淺的開發人員來說難度非常大,好的一點是JVM 能夠記錄下問題發生時系統的部分運行狀態,并將其存儲在堆轉儲 (Heap Dump) 文件中,從而為我們分析和診斷問題提供了重要的依據。要生存Heap Dump文件的前提是需要在服務的啟動腳本添加一些jvm參數。

接下來將講解如何生產Heap Dump文件到如何使用Memory Analyzer Tool分析Heap Dump文件。Memory Analyzer Tool是一款“傻瓜式“的堆轉儲文件分析工具,通過該工具可以生成一個專業的分析報告,從而準確的定位到問題的所在位置。

1、安裝 Memory Analyzer Tool

方式一:直接從官網下載程序包 http://www.eclipse.org/mat/downloads.php,解壓可直接使用。

方式二:在Eclipse中通過 Help -> Install New Software,輸入地址 http://download.eclipse.org/mat/1.9.0/update-site/進行安裝

方式三:Eclipse 的可插拔式插件安裝方式

2、配置環境參數

為了更有效率的使用Memory Analyzer Tool,還需要做一些配置工作。因為通常而言,分析一個堆轉儲文件需要消耗很多的堆空間,為了保證分析的效率和性能,在有條件的情況下,建議分配給 Memory Analyzer?Tool盡可能多的內存資源。可以采用如下兩種方式來分配內存更多的內存資源給 Memory Analyzer?Tool 。

方式一:修改啟動參數 MemoryAnalyzer.exe -vmargs -Xmx4g

方式二:編輯文件 MemoryAnalyzer.ini,在里面添加類似信息 -vmargs – Xmx4g

3、如何獲得堆轉儲文件

方式一:在Eclipse中配置JVM啟動參數 -XX:+HeapDumpOnOutOfMemoryError

方式二:通過JDK自帶的工具jmap,jconsole來獲得一個堆轉儲文件

這里使用方式一來獲得

Java中OutOfMemoryError(內存溢出)的三種情況及解決辦法

在解決java內存溢出問題之前,需要對jvm(java虛擬機)的內存管理有一定的認識。jvm管理的內存大致包括三種不同類型的內存區域:PermanentGeneration space(永久保存區域)、Heap space(堆區域)、JavaStacks(Java棧)。其中永久保存區域主要存放Class(類)和Meta的信息,Class第一次被Load的時候被放入PermGenspace區域,Class需要存儲的內容主要包括方法和靜態屬性。堆區域用來存放Class的實例(即對象),對象需要存儲的內容主要是非靜態屬性。每次用new創建一個對象實例后,對象實例存儲在堆區域中,這部分空間也被jvm的垃圾回收機制管理。而Java棧跟大多數編程語言包括匯編語言的棧功能相似,主要基本類型變量以及方法的輸入輸出參數。Java程序的每個線程中都有一個獨立的堆棧。容易發生內存溢出問題的內存空間包括:PermanentGeneration space和Heap space。

第一種OutOfMemoryError:PermGenspace

發生這種問題的原意是程序中使用了大量的jar或class,使java虛擬機裝載類的空間不夠,與PermanentGeneration space有關。解決這類問題有以下兩種辦法:

1、增加java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小,其中XX:PermSize是初始永久保存區域大小,XX:MaxPermSize是最大永久保存區域大小。如針對tomcat,在catalina.sh或catalina.bat文件中一系列環境變量名說明結束處(大約在70行左右) 增加一行:

JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"

第二種OutOfMemoryError:Java heap space

發生這種問題的原因是java虛擬機創建的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與Heapspace有關。解決這類問題有兩種思路:

1、檢查程序,看是否有死循環或不必要地重復創建大量對象。找到原因后,修改程序和算法。

2、增加Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。如:set JAVA_OPTS= -Xms256m-Xmx1024m

第三種OutOfMemoryError:unable to create new nativethread

這種錯誤在Java線程個數很多的情況下容易發生

4、實例分析編寫例子獲取Heap?Dump文件

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

public?class?HeapDumpMain?{

????static?class?OOMHeapDumpObject{
????????String?str?="1234567890";
????}

????public?static?void?main(String[]?args)?{
????????List?ooms?=?new?ArrayList();
????????while?(true)?{
????????????ooms.add(new?OOMHeapDumpObject());
????????}
????}

}

Eclipse中VM參數配置如下

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

運行示例代碼即可生成Heap?Dump文件

一般在項目的當目前目錄下

運行Memory Analyzer?Tool(個人比較喜歡獨立運行的Memory Analyzer?Tool)

報告分析

內存使用整體情況

直接點擊下方的 Reports->Leak Suspects 鏈接來生成報告,查看導致內存泄露的罪魁禍首

從圖上可以清晰地看到一個可疑對象消耗了系統近 98% 的內存。再往下看餅圖下方文字簡短描述了大量的內存是由屬于Object實例的對象所消耗的,system class loader 負責加載這個對象。也許從這里還不能找出內存泄漏的具體原因,接著往下看。點擊下圖標志的地方

可以看到如下

備注:

Shallow Heap 為對象自身占用的內存大小,不包括它引用的對象。

Retained Heap 為當前對象大小 + 當前對象可直接或間接引用到的對象的大小總和

在這張圖上可以清楚的看到,這個對象集合中保存了大量 OOMHeapDumpObject 對象的引用,就是它導致的內存泄露。這時就需要排查程序中為什么會創建這么多OOMHeapDumpObject?對象,然后解決問題。

參考:

https://www.jianshu.com/p/fc0e9e0a3ef2

https://my.oschina.net/feinik/blog/874023#comments

往期精彩

01?漫談發版哪些事,好課程推薦

02?Linux的常用最危險的命令

03?互聯網支付系統整體架構詳解

04?優秀的Java程序員必須了解的GC哪些

05?IT大企業有哪些病,別被這些病毀了自己?

關注我每天進步一點點

你點的每個在看,我都認真當成了喜歡

總結

以上是生活随笔為你收集整理的new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。