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執行緒
- JVM堆記憶體設定JVM記憶體
- JVM 堆記憶體設定原理JVM記憶體
- JavaScript 常量定義詳解JavaScript
- eclipse設定JVM記憶體堆EclipseJVM記憶體
- 堆的定義、特點及實現
- JVM中堆的介紹JVM
- 【JVM之記憶體與垃圾回收篇】堆JVM記憶體
- C++堆疊詳解C++
- Java JVM——8.堆JavaJVM
- JVM垃圾回收詳解JVM
- Java虛擬機器(JVM)中的記憶體設定詳解Java虛擬機JVM記憶體
- 結構體定義:struct與typedef struct 用法詳解和用法小結結構體Struct
- 遺失的JVM堆記憶體JVM記憶體
- 關於C++類的定義和物件的建立詳解C++物件
- JVM GC 日誌詳解JVMGC
- 最詳細的JVM&GC講解JVMGC
- Java生產環境JVM設定成固定堆大小深層原理JavaJVM
- JVM之棧、堆、方法區(三)JVM
- JVM原始碼分析之堆外記憶體完全解讀JVM原始碼記憶體
- JVM系列(四) – JVM類載入機制詳解JVM
- JVM系列(四) - JVM類載入機制詳解JVM
- MySQL定義異常和異常處理詳解MySql
- JVM記憶體模型詳解JVM記憶體模型
- JVM虛擬機器詳解JVM虛擬機
- jvm(四)——JVM自帶記憶體分析工具詳解JVM記憶體
- “阿里架構師”的JVM之GC詳解阿里架構JVMGC
- 《演算法筆記》4. 堆與堆排序、比較器詳解演算法筆記排序
- 深入理解JVM(八)——java堆分析JVMJava
- Spring系列第四講 xml中bean定義詳解SpringXMLBean
- 圖文詳解Andorid中用Shape定義GradientDrawable
- 九、JVM記憶體模型詳解JVM記憶體模型
- JVM執行時區域詳解。JVM
- Java直接(堆外)記憶體使用詳解Java記憶體
- c語言的定義與宣告C語言
- C++ 類方法解析:內外定義、引數、訪問控制與靜態方法詳解C++