---
# System prepended metadata

title: 不～怎麼又 OOM 啦！Intellij VisualVM Launcher
tags: [IDEA, blog, java]

---

# 不～怎麼又 OOM 啦！Intellij VisualVM Launcher
![](https://i.imgur.com/ai8Dsje.png)

## 聞風喪膽的 OOM
大多人對於下面的錯誤訊息一定不陌生
```log
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
```
在一般非預期的情況下，就是有某處的程式碼一下讀取了過多的資料進到記憶體中，又或者是某個地方的迴圈沒有寫好
使用一段最簡單的程式碼來重現這個錯誤
```java 
public class Main {
    public static void main(String[] args) {
        final List<Integer> list = new ArrayList<>();
        while(true){
            list.add(1);
        }
    }
}
```
並且在執行的時候加上一些 vm 參數來限制記憶體大小，讓錯誤更快產生
```java
-Xms18m -Xmx18m
```
## 分析
通常錯誤發生時，我們最想要知道的就是當下的記憶體的使用情況，透過觀察某類別的資料大小，可以推敲出是什麼地方可能有 memory leak 的風險，才能加以改善。
這邊會在 vm 參數加上
```java 
-Xms18m -Xmx18m -XX:+HeapDumpOnOutOfMemoryError
```
讓程式在遇到 OOM 錯誤的時候產出一份 .hprof 的檔案，通常會使用 mat (Memory Analyzer Tool) 來進行分析，但這都是事發之後才來做的事情，如果我們想要觀測這個錯誤的產生過程，可以怎麼做？

## VisualVM
>VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling capabilities.

download：https://visualvm.github.io/download.html
運行 `/bin/visualvm` 即可透過 VisualVM 來觀察目前的 Java Application 記憶體變化
![](https://i.imgur.com/Tz8ZgCI.png)

![](https://i.imgur.com/c1JJoEC.png)

有了這樣的幫助，我們就可以在 local 環境上觀察程式運作的記憶體變化，從這個過程中來發現是不是某個方法不如預期中的進行，佔用到了過多的記憶體。
## Intellij VisualVM Launcher
plugin：https://plugins.jetbrains.com/plugin/7115-visualvm-launcher

不過這樣的方式每次都還要自己手動開啟稍嫌麻煩，是不是可以在 Intellij 也提供一個快捷的方式來啟動？
那就要安裝 `VisualVM Launcher` 來幫忙了。

安裝後，指定 VisualVM 的執行位置即可
![](https://i.imgur.com/BfVwwTy.png)

在熟悉的 IDEA 右上角，原本應該只有 run/debug，現在還多了有 `Run with VisualVM`
![](https://i.imgur.com/6EUVOF3.png)

透過上述的配置，我們就可以在運行程式碼的同時，也啟動 VisualVM 一併觀察記憶體的變化，來找出真正 memory leak 的所在之處。

## 如何善用
我們在前面的文章 [Spring Data JPA - MySQL using streams (1)](https://hackmd.io/KePD8UeBQ4K0rf2-rflroQ?view) 中提到可以使用 stream 來穩定過程中的記憶體使用量，那看完這篇文章之後，就可以搭配使用，在 local 運行的階段中，來觀察記憶體用量是不是如文中所述，而不是一口氣的記憶體暴增（將查詢結果都存到記憶體中）。

###### tags: `blog` `java` `IDEA`