天天看點

jvm學習——jvm記憶體區域前言一、堆二、虛拟機棧 / 本地方法棧三、方法區四、程式計數器五、運作時常量池六、直接記憶體總結

前言

jvm是java為了實作一次編譯多處運作的秘籍,在jvm裡面抽象出來了一個虛拟的機器,jvm為自己設計了一套記憶體模型——堆、棧、本地方法棧、方法區、程式計數器

一、堆

Java堆是虛拟機中生産和管理對象的一塊兒記憶體。幾乎所有的對象會在堆記憶體上進行建立,同時堆記憶體也會對這些記憶體進行管理,對于大部分的對象都是朝生夕滅。堆記憶體中需要一些算法來清理這些記憶體。

其中較為人知的包括對象标記算法——可達性分析。為了更好地回收記憶體,堆記憶體的分帶管理,對于堆記憶體分為edan, from suviver, to suviver, old 等幾個區域。并對于不同的區域使用不同的清理算法。包括對于edan區會設定标記整理算法,對于老年代會有标記清理算法等等。

這個區域是在Jvm中各個線程共享的區域,同時如果再配置設定記憶體的時候,如果在堆上無法再建立對象了,那麼這時會跑出OutOfMemoryError異常。

二、虛拟機棧 / 本地方法棧

虛拟機棧是JVM中跟方法調用有關的一個記憶體。在棧中,每一次調用方法會同步建立棧幀,在棧幀中存儲局部變量表,操作數棧,動态連結,方法出口等資訊。一個方法的調用和完成就是一個棧幀入棧和出棧的過程。

為了保證JVM的方法能夠每個線程正常地執行,虛拟機棧也是線程私有的。

局部變量表中存在了方法中的基本資料類型(int, double, long)和引用類型和傳回位址類型。

如果對于虛拟機棧調用深度過長,那麼就可能會跑出StackOverflowError。

三、方法區

方法區是用于存儲Java程式的一些中繼資料資訊,包括類資訊,常量和靜态變量,即時編譯後生成的代碼緩存等資料。在hotspot上,jdk8之前,會使用永久代來實作一個方法區,同時對于方法區的回收基本上是很難去做到的。而在jdk8之後,已經改為元空間來實作一個方法區了。

方法區可以說也是存放一些程式資料時會用到的,也是多個線程會同時通路的區域。如果在虛拟機中程式運作的時候,方法區記憶體不夠,也會跑出OutOfMemoryError異常

四、程式計數器

程式計數器是一塊比較小的空間,相似與計算機内部的程式計數器,它會指向正在執行的代碼行号。不過在JVM中的程式計數器是線程私有的,這樣可以做到每個線程執行的程式互不影響,獨立存儲。

五、運作時常量池

運作時常量池是方法區的一部分,用于存放在編譯器生成的各種字面量和符号引用,這部分内容将在類加載之後存放在方法區的運作時常量池

六、直接記憶體

在NIO中可以通過native函數直接配置設定對外記憶體,避免了Java堆和native對之間來回複制資料。

總結

提示:這裡對文章進行總結:

例如:以上就是今天要講的内容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理資料的函數和方法。