1.如何分析jvm內(nèi)存溢出呢
我們經(jīng)常用visualVm監(jiān)控Jvm的內(nèi)存,cpu,線程的使用情況,通??梢愿鶕?jù)內(nèi)存不斷增長來判斷內(nèi)存是否存在不釋放。但是我們不可能時時盯著去看,這里涉及jvm堆內(nèi)存配置,堆內(nèi)存參數(shù)配置和調(diào)優(yōu)會在其他章節(jié)編寫。
如果真是內(nèi)存溢出了,線上出現(xiàn)的我們需要配置JVm內(nèi)存溢出,建議線上一定要配置此參數(shù)XX:+HeapDumpOnOutOfMemoryError,否則到時不好分析線上問題。
-Xms100m -Xmx100m -XX:+HeapDumpOnOutOfMemoryError?
?2.編寫我們自己的代碼
接下來我們模擬內(nèi)存溢出代碼?
@Getter
@Setter
@ToString
public class HeapBean {
private int userId;
private String name;
private String phone;
}
package com.es.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class HeapController {
private List<HeapBean> userlist = new ArrayList<>();
private Map hashMap=new HashMap<>();
//堆區(qū)內(nèi)存溢出
@GetMapping("/heapOom")
public void heapOverTest() {
int i = 0;
while (true) {
//heaplist.add(new heapBean());
hashMap.put(i, new HeapBean());
i++;
}
}
}
本地啟動代碼,后請求實際地址。
運行到一定時間,就會生成hprof文件。
java.lang.OutOfMemoryError: GC overhead limit exceeded Dumping heap to java_pid16868.hprof ... Heap dump file created [171733163 bytes in 0.854 secs] Exception in thread "File Watcher" java.lang.OutOfMemoryError: GC overhead limit exceeded at java.lang.String.toLowerCase(String.java:2647) at java.io.WinNTFileSystem.hashCode(WinNTFileSystem.java:640) at java.io.File.hashCode(File.java:2132) at org.springframework.boot.devtools.filewatch.FileSnapshot.hashCode(FileSnapshot.java:72) at java.util.HashMap.hash(HashMap.java:338) at java.util.HashMap.put(HashMap.java:611) at java.util.HashSet.add(HashSet.java:219) at org.springframework.boot.devtools.filewatch.DirectorySnapshot.collectFiles(DirectorySnapshot.java:70) at org.springframework.boot.devtools.filewatch.DirectorySnapshot.collectFiles(DirectorySnapshot.java:67)
通過everything找到這個文件.
?
3.需要用到eclipse Memory Analyzer工具
Eclipse Memory Analyzer(簡稱MAT)是一個功能豐富且操作簡單的JVM Heap Dump分析工具,可以用來輔助發(fā)現(xiàn)內(nèi)存泄漏減少內(nèi)存占用。
點擊下載
?點擊“MemoryAnalyzer.exe”,啟動分析內(nèi)存工具。
?打開java_pid16868.hprof文件
按照紅色選項點擊Finish確認(rèn),看到占用最多的40.5MB。
往下移動看到具體占用的類
點擊details,看到我們自己的類。
?繼續(xù)往下,看到對象的總數(shù)和占用的堆內(nèi)存。
文章來源:http://www.zghlxwxcb.cn/news/detail-706905.html
4.總結(jié)?
?總結(jié)最后到時HeapControler中的hashMap導(dǎo)致的內(nèi)存溢出。文章來源地址http://www.zghlxwxcb.cn/news/detail-706905.html
到了這里,關(guān)于Java jvm 內(nèi)存溢出分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!