簡體   English   中英

Java:靜態字段存在於內存中的哪個位置?

[英]Java: where do static fields live within the memory?

如果我們將對象存儲在對象的靜態字段中,JVM如何為它分配內存? 它是否存在於“隱含”(不確定我是否使用正確的單詞)類對象中? 靜態字段與對象字段有何不同?

靜態字段是類變量,並在該類的所有實例之間共享。 實例變量(或我認為你稱之為的對象字段)屬於類的各個實例,不共享。

至於它們存儲在內存中的位置將基於JVM的實現,並且沒有理由需要兩個不同的JVM來按規范將它們存儲在同一個地方(據我所知至少 - 應該插入適當的規格表鏈接在這里)。

正如Nick的回答所說,語言規范沒有規定具體的“物理”位置,但就你可以推理的邏輯心理模型而言,它可能會幫助你將靜態字段視為附加到類對象(這些字段所屬的類的Foo.class )。

例如,調用時:作為題外話,類對象被以其他方式與靜態實體處理時(即語言規范中規定)中使用synchronized靜態方法,鎖被保持在類方法的類對象上屬於。

靜態字段是類的一部分; 據說,當班級被卸下時,它們會消失。 將它們想象成靠近Class實例是有意義的。 有關內存如何布局的詳細信息超出了Java應用程序的范圍; 作為必然結果,JVM規范沒有強制要求該主題。 即使是卸載類時字段的“消失”也無法直接觀察到,只能通過GC操作,假設有一個良好放置的finalize()方法。

靜態字段存儲在Class對象中,該對象保存在PemGen空間中。 這是堆內存的一部分。

正如NickLarsen所說,我認為沒有任何JVM規范如何存儲靜態字段。 編譯定義的常量(static final)將在編譯期間替換最可能的表達式。 對於變量靜態字段,只有兩個選項:堆或(如果存在)JVM的數據段。

暫無
暫無

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

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