Java虛擬機運行時數據區域:
1.程序計數器
a) 類似於計算機組織原理中PC計數器。
b) 線程私有。
c) 唯一一個沒有OOM的區域。
2.Java虛擬機棧
a) 線程私有。
b) 相當於棧內存,每個元素爲一個棧幀。
3.本地方法棧
a) 用於執行Native方法(所謂Native方法就是用C語言等較底層語言寫的方法)。
4.Java堆
a) 存放對象地方。
b) 分爲新生代和老年代。
5.方法區
a) 所有的類被虛擬機加載後存放在此處。
b) 被稱爲“永久代”。(剛看的時候有點疑惑,想不明白這個名稱到底有什麼含義,學到後面的GC還有類加載章節後才慢慢有點感悟。因爲在java虛擬機的運行時數據區域的大小是有限的,裏面的數據滿了以後就會發生溢出,所以要時刻進行垃圾收集。雖然垃圾收集動作重點集中在java堆中,但是方法區裏面也存在大量數據,不進行垃圾收集的話也有可能會發生內存泄漏。不過方法區的垃圾收集相對較少,這也是被稱爲“永久代”的原因,幾乎永遠不會被收集,這是因爲方法區存放的是類被加載後的信息,相當於把class文件進一步處理得到的信息,這些信息是準備在運行時刻被使用的。如果被垃圾收集,等到再需要時又要重新加載就會非常耗時,所以通常很少被GC。這只是我自己的理解歡迎大家指正。)
6.運行時常量池
a) 是方法區的一部分。
b) 存放編譯期生成的各種字面量和符號引用。
c) 有時候翻譯出來的直接引用也存儲在運行時常量池中。
d) 運行期間也有可能將新的常量放入池中,例如string類的intern()方法。
7.直接內存
Java虛擬機運行時數據區域:
1.程序計數器
a) 類似於計算機組織原理中PC計數器。
b) 線程私有。
c) 唯一一個沒有OOM的區域。
2.Java虛擬機棧
a) 線程私有。
b) 相當於棧內存,每個元素爲一個棧幀。
3.本地方法棧
a) 用於執行Native方法(所謂Native方法就是用C語言等較底層語言寫的方法)。
4.Java堆
a) 存放對象地方。
b) 分爲新生代和老年代。
5.方法區
a) 所有的類被虛擬機加載後存放在此處。
b) 被稱爲“永久代”。(剛看的時候有點疑惑,想不明白這個名稱到底有什麼含義,學到後面的GC還有類加載章節後才慢慢有點感悟。因爲在java虛擬機的運行時數據區域的大小是有限的,裏面的數據滿了以後就會發生溢出,所以要時刻進行垃圾收集。雖然垃圾收集動作重點集中在java堆中,但是方法區裏面也存在大量數據,不進行垃圾收集的話也有可能會發生內存泄漏。不過方法區的垃圾收集相對較少,這也是被稱爲“永久代”的原因,幾乎永遠不會被收集,這是因爲方法區存放的是類被加載後的信息,相當於把class文件進一步處理得到的信息,這些信息是準備在運行時刻被使用的。如果被垃圾收集,等到再需要時又要重新加載就會非常耗時,所以通常很少被GC。這只是我自己的理解歡迎大家指正。)
6.運行時常量池
a) 是方法區的一部分。
b) 存放編譯期生成的各種字面量和符號引用。
c) 有時候翻譯出來的直接引用也存儲在運行時常量池中。
d) 運行期間也有可能將新的常量放入池中,例如string類的intern()方法。
7.直接內存