JVM 堆的定義與詳解
Heap 堆的定義
定義 :通過 new 關鍵字,建立物件都會使用堆記憶體
特點
- 它是執行緒共享的,堆中物件都需要考慮執行緒安全的問題
- 有垃圾回收機制
堆記憶體溢位
使用下面程式碼進行演示
import java.util.ArrayList;
import java.util.List;
public class heap_overflow {
public static void main(String[] args) {
int i = 0;
try {
List<String> list = new ArrayList<>();
String a = "hello";
while (true) {
list.add(a); // hello, hellohello, hellohellohellohello ...
a = a + a; // hellohellohellohello
i++;
}
} catch (Throwable e) {
e.printStackTrace();
System.out.println(i);
}
}
}
在這裡對程式碼進行解釋,在new一個List物件之後,在while true死迴圈當中,每一次都會有一個值加入到list集合當中,在這裡list的作用區間在try這個裡面,也就是說當這個try程式碼塊還沒有跑完,這個list是不會被垃圾回收機制進行回收的,並且字串物件同理,是不會被回收的。所以程式碼只迴圈了25次就會丟擲異常 java.lang.OutOfMemoryError: Java heap space
這個時候因為記憶體已經佔滿。
在這裡我們也可以設定堆記憶體的大小引數,使用 -Xmx 進行設定,我們給Xmx設定為16m,再進行測試。在這篇文章有怎麼 設定引數 (eclipes)
堆記憶體診斷
- jps 工具
檢視當前系統中有哪些 java 程式 - jmap 工具
檢視堆記憶體佔用情況 jmap - heap 程式id - jconsole 工具
圖形介面的,多功能的監測工具,可以連續監測
在這裡使用一段程式碼進行測試:
public class heap_memory {
public static void main(String[] args) throws InterruptedException {
System.out.println("1...");
Thread.sleep(30000);
byte[] array = new byte[1024 * 1024 * 10]; // 10 Mb
System.out.println("2...");
Thread.sleep(20000);
array = null;
System.gc();
System.out.println("3...");
Thread.sleep(1000000L);
}
}
在idea當中進行檢視:先演示這個jmap
而jconsole是一個圖形介面工具,同上所示,開啟後輸入命令jconsole,選擇當前執行的這個java程式,建立連線,
建立安全連線失敗,建立不安全連線。可以仔細的看到當前堆記憶體的使用。
還有一個工具 jvisualvm
相關文章
- JVM堆記憶體詳解JVM記憶體
- JVM詳解(四)——執行時資料區-堆JVM
- JVM 堆記憶體設定原理JVM記憶體
- eclipse設定JVM記憶體堆EclipseJVM記憶體
- 堆的定義、特點及實現
- JVM中堆的介紹JVM
- 【JVM之記憶體與垃圾回收篇】堆JVM記憶體
- jvm 堆記憶體JVM記憶體
- Java JVM——8.堆JavaJVM
- 關於C++類的定義和物件的建立詳解C++物件
- JVM GC 日誌詳解JVMGC
- 《JVM第7課》堆區JVM
- 探索JVM的垃圾回收(堆記憶體)JVM記憶體
- Spring系列第四講 xml中bean定義詳解SpringXMLBean
- Java生產環境JVM設定成固定堆大小深層原理JavaJVM
- JVM系列(四) – JVM類載入機制詳解JVM
- JVM系列(四) - JVM類載入機制詳解JVM
- JVM虛擬機器詳解JVM虛擬機
- JVM記憶體模型詳解JVM記憶體模型
- JVM原始碼分析之堆外記憶體完全解讀JVM原始碼記憶體
- JVM(程式計數器,棧,堆)JVM
- JVM之棧、堆、方法區(三)JVM
- “阿里架構師”的JVM之GC詳解阿里架構JVMGC
- jvm(四)——JVM自帶記憶體分析工具詳解JVM記憶體
- 《演算法筆記》4. 堆與堆排序、比較器詳解演算法筆記排序
- Java中常見方法詳解合集(方法的定義及語法結構)Java
- C++ 類方法解析:內外定義、引數、訪問控制與靜態方法詳解C++
- Spring核心——Bean的定義與控制SpringBean
- c語言的定義與宣告C語言
- 九、JVM記憶體模型詳解JVM記憶體模型
- Java直接(堆外)記憶體使用詳解Java記憶體
- XML Schema 複雜元素型別詳解:定義及示例解析XML型別
- JVM入門(JVM引數詳解和常用命令)JVM
- [JVM工具(1)] 堆疊檢查利器jstat的使用JVMJS
- XML Schema(XSD)詳解:定義 XML 文件結構合法性的完整指南XML
- VS Code使用之基本設定與配置詳解
- 深入mysql建立自定義函式與儲存過程的詳解MySql函式儲存過程
- 方法(函式)的定義與引數函式