1. Java內存模型
1.1. Java內存模型
Java內存模型(Java Memory Model ,JMM)就是一種符合內存模型規範的,屏蔽了各種硬件和操作系統的訪問差異的,保證了Java程序在各種平臺下對內存的訪問都能保證效果一致的機制及規範。
1.2. Jvm內存模型
1.2.1. 堆
所有對象實例及數組都要在堆上分配內存。但隨着JIT編譯器的發展和逃逸分析技術的成熟,可將這些變量直接在棧上進行分配。它是所有線程共享的區域,也是gc的主要區域。
默認情況下對大小爲1/64~1/4。通過-Xms(最小值)和-Xmx(最大值)參數設置,一般都設置相等,服務器一般內存都足夠。以避免堆大小的伸縮帶來的性能損耗。
堆內存 = 新生代+老生代+持久代,默認新生代和老生代(大小比例1:2,新生代=Eden+Eden和Survivor0,Survivor1組成,三者的比例是8:1:1
新生代的回收機制採用複製算法,老生代採用的回收算法是標記整理算法
1.2.2. 方法區
是所有線程共享的內存區域,爲了區分堆,又被稱爲非堆,用於存儲已被虛擬機加載的類信息、常量、靜態變量。
運行時常量池,是方法區的一部分,存放編譯期間生成的各種字面量和符號引用。
方法區也稱"永久代",jdk1.8,已經移除,取而代之是元空間(Metaspace),可以通過MaxMetaspaceSize進行設置,但是受限本地內存,默認是根據運行時動態調整
1.2.3. 棧
## 描述的是java方法執行的內存模型
##每個方法被調用到執行完的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。聲明週期與線程相同,是線程私有的,
##棧幀由三部分組成:局部變量區、操作數棧、幀數據區
1.2.4. 程序計數器
由於cpu運行速度極快,可以同時處理多個線程,在線程切換,切換的時候需要知道線程執行到哪裏了。程序計數器是唯一個不會內存溢出的地方。
1.2.5. 本地方法區
調用c或者c++代碼地方