當前位置:
首頁 > 知識 > JVM學習系列學習三

JVM學習系列學習三

我們接著上一篇文章講解:

堆、棧、永久區比較

Heap(堆內存):

在Java中,創建的所有引用對象類型,都在堆內存中。堆內存中的數據由GC對其進行管理的。其實堆內存也是GC主要管理的地方。

如:釋放不再被程序引用的對象所佔用的內存

Stack(棧內存)

棧內存與堆內存是相對的。棧內存存放的是基礎數據類型。如:int、long等。是由程序的執行順序控制變數的進出棧順序,這裡的數據不受GC管控的。

Perm(永久區)

永久區是用於存儲類的元數據。如:類的定義、方法定義(application metadata),用來描述類及方法的元數信息。

需要注意的是:永久區不是堆的一部分。

永久區的生命周期與JVM是綁定的;

堆內存的生命周期與程序綁定的。

內存管理優化參數:

-Xms

設置JVM啟動時的堆內存(Heap)的大小

-Xmx For setting the maximum heap size.

設置堆內存(Heap)的最大值

-Xmn

設置 Young Gen 內存區的大小

-XX:PermGen

設置 Perm Gen 內存的初始大小

-XX:MaxPermGen

設置 Perm Gen 內存的最大值

-XX:SurvivorRatio

設置 Eden Gen 與 S0 Gen,S1 Gen 內存的大小比。默認值:8

例如:

Young Gen 大小為 10M,

-XX:SurvivorRatio=2

則:

Eden Gen 的大小為 5,

S0 和 S1 的大小分別為 2.5

-XX:NewRatio

設置 Old Gen / Young Gen 的值。默認:2

大部分情況下,默認值不用調。

JDK1.8堆內存模型

從上圖中我們可以看出,在JDK1.8的內存模型中是由2部分組成的:年輕代和年老代

年輕代:Eden 2*svrvivor

年老代:OldGen

1.8與1.7堆內存模型區別:

在1.8中最大的變化就是Perm區(年老區),用metaspace(元數據空)進行了替換。

這裡需要特彆強調的是:元數據區(metaspace)所佔用的內存空間並非虛擬機內部的,而是直接在本地的內存空間中。這也是1.8與1.7永久代最大的區別所在。

在1.8之後為什麼要廢棄掉1,7中永久區呢?

官方給出的答案:

在實際使用中,永久區內存經常會出現不夠用的情況或是發生內存泄漏,也就是拋出java.lang.OutOfMemoryError:PermGen的錯誤。基於這個原因,才改用使用本地內存空間。

本文是《JVM學習系列》中的第三篇文章。如果想系統的學習,建議從本教程第一篇開始看。

下節預告:

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 凱哥java 的精彩文章:

怎麼將本地項目放到碼雲 gitee上面?圖文詳解
胡歌再次當伴郎被搶到手捧花

TAG:凱哥java |