1. 程式人生 > >℃江的觀後感 -- Java 虛擬機器的方法區、直接記憶體和執行時常量池

℃江的觀後感 -- Java 虛擬機器的方法區、直接記憶體和執行時常量池

  • 方法區

    我們知道方法區,當然是和方法有關,Java虛擬機器的作用就兩個,儲存、運算。其實我們叫其方法區,說明和儲存東西有關,但是存什麼呢?這塊儲存的是虛擬機器載入的類資訊,常亮,靜態變數和有個就是即使編譯後的程式碼等資料。方法區一般在hotspot被稱為永久代。但是其他Java虛擬機器不是這樣的概念哈。垃圾回收主要在堆中進行,但也會出現在方法區中,而且效率不高,因為你想想常量池一般定義成常亮就會是經常被使用的,所以你再怎麼執行垃圾回收也是白搭,故效率低下。

  • 執行時常量池

    這個池子是屬於方法區的,這裡面都存什麼呢?其會存一些編譯期生成的各種自變數以及一些符號引用,這些東西都是在類載入以後會存放在方法區中的常量池中進行引用。String a = “111”; String b = “111”; 這個變數 a b 如果放在堆記憶體中的,那a 一定不等於b,但結果是是a== b。顯然不是放在堆中的,除非是new 出來的。在執行時常量池中的變數實際上是HashSet 的資料結構,所以你懂得,儲存內容部位重複。其實堆中的new 出來的變數,可以通過intern()方法將其放在執行常量池中。

  • 直接記憶體

    經常被使用的一塊區域,隨著NIO的出現而產生的,裡面有個通道的概念,從而分配堆外記憶體,由此使得Java虛擬機器不再受限本身記憶體。NIO所需要的記憶體就是直接記憶體,當然了伺服器記憶體也是有上限的,所以也是有可能發生記憶體溢位的問題的。