簡體   English   中英

Java如何管理內存中的變量

[英]How Java manages variables in memory

假設我有以下代碼:

{
    int var = 2;
    // more code
}

代碼執行后不再使用'var'會發生什么? 是從內存中刪除還是留在內存中,還是其他?

與此相關的是,以這種方式使用變量更好,還是制作一些全局變量並僅更改其值呢?

局部變量存在於堆棧中。 如果它是對對象的引用,則只有變量在堆棧上。

實例變量位於堆中,因為它們屬於對象。

另外, 這篇文章java中的堆棧和堆內存 )可能會有所幫助。

簡而言之,在Java(和其他JVM語言)中,您根本不必關心內存分配和釋放。 您真的不應該為此擔心。 一旦失去對該變量的引用(在這種情況下,當方法調用結束時),該變量實際上就消失了。 在此之后的一段不確定的時間里,垃圾回收線程會注意到您無法再訪問該變量,並釋放它正在使用的內存。 請參閱: Java中的垃圾收集

如果要將任何變量定義為實例變量,則實例將使用該變量。 實例將保存在堆存儲區中。 垃圾收集器將定期運行以從內存中清除未引用的對象。

但是如果在任何塊或方法中定義了該變量,則將其存儲在堆棧存儲器中。

Java Stack內存用於執行線程。 它們包含短期的方法特定值,以及從該方法引用的對堆中其他對象的引用。 堆棧存儲器始終按LIFO(后進先出)順序引用。 每當調用方法時,都會在堆棧存儲器中創建一個新塊,以容納該方法的本地原始值並引用該方法中的其他對象。 方法結束后,該塊將立即變為未使用狀態,並可用於下一個方法。

當不再引用Java時,它將從內存中刪除所有內容。 在Java中導致真正的內存泄漏需要花費很多精力。
像int,boolean和char這樣的Java原語一旦離開范圍,便被放到棧中並從內存中刪除。 Java對象(例如String,數組或ArrayList)在堆上分配(並由堆棧上的局部變量引用)。 當不再有對象引用時,將對其進行垃圾回收(從內存中刪除)。
靜態變量屬於一個類,只要加載該類(通常是Java程序的整個運行時間),它就將是對對象的引用。 靜態是Java與全局變量最接近的事物,但是靜態的過度使用或濫用實際上是導致內存問題而不是解決它們的一種方法。

暫無
暫無

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

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