簡體   English   中英

Java靜態基元,對象,方法和堆(內存管理和最佳實踐)

[英]Java Statics Primitives, Objects, Methods and the Heap (Memory Management & Best Practices)

好的,所以我已經用Java開發了一年多一點時間,並且正在努力深入學習語言及其最佳實踐。

所以這就是我所知道的:

  • Java“按類型傳遞” - 即基元通過副本傳遞,對象引用通過副本傳遞(引用指向堆上的對象)。

  • 原始實例變量和引用存在於堆中的類對象中,而本地原語和引用存在於堆棧中(在它們各自的堆棧幀中)。

  • Perm Gen.存儲空間是存儲類元數據的位置(用於反射)。

  • Heap有一個Eden空間,其中有新對象,一個Young空間,其中存放了GC的對象,以及Tenured空間,其中放置了長壽命對象。

所以這就是我想要了解的內容

  • 靜態和靜態最終基元和引用在哪里,JVM能夠使用單個實例?

  • 靜態和靜態最終對象是否存儲在堆中(我假設它們被移動到終身)?

  • 根據應用程序中靜態最終引用的數量,什么被認為是最佳實踐?

  • 創建更多靜態最終引用會減少JVM中的堆空間量嗎?

我已經閱讀了很多不同的解釋(都有所不同),並且如果Java語言中經驗豐富的老手可以提供一個很好的解釋,我會很高興。 提前致謝!

年輕的空間包括伊甸園空間和幸存者空間。

靜態和靜態最終基元和引用在哪里,JVM能夠使用單個實例?

它沒有定義,但在Sun / Oracle JVM中,靜態字段存在於類字段的特殊對象中。 每個類加載器有一個實例,因此靜態字段可以有多個實例。

靜態和靜態最終對象是否存儲在堆中(我假設它們被移動到終身)?

在Sun / Oracle Java 7中,它們是。 他們可能在Perm Gen或任何其他地方。

根據應用程序中靜態最終引用的數量,什么被認為是最佳實踐?

將它們保持在最低限度。

創建更多靜態最終引用會減少JVM中的堆空間量嗎?

如果您可以將最終字段更改為靜態最終字段,則可以節省一些空間(如果您有多個實例)但是,清晰度通常比性能更重要。 (我會這樣做是為了清晰)

順便說一句:我用Java開發了13年。

因此,可能存在多個靜態字段實例 - JVM是否會更改每個實例

他們是獨立的。 每個類加載器都可以加載自己的類版本(代碼不必相同),每個類加載器都有自己的靜態字段(它們也不必相同)

如果更改靜態字段(即static int instanceCount,其中instanceCount ++在每個對象構造上執行)?

沒有。

對象可以移動到Perm Gen嗎?

不可以。某些位置未定義的某些數據必須在任何位置,具體取決於實現和版本。

Perm Gen.被認為是堆的一部分嗎?

它是舊的gen = tenured + perm gen的一部分。

年輕的gen = eden +幸存者空間* 2

最大堆大小限制年輕人和終身總數。 彼爾姆和直接記憶有其自身的極限。 完成的內存映射文件遵循任何這些限制。

對於默認並行收集器和並發標記掃描,這是正確的。

G1收集器不會以相同的方式划分空間。


鏈接了解更多詳情

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

Java堆術語:年輕,古老和永久的世代?

http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM