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學習系列》中的第三篇文章。如果想系統的學習,建議從本教程第一篇開始看。
下節預告:
※怎麼將本地項目放到碼雲 gitee上面?圖文詳解
※胡歌再次當伴郎被搶到手捧花
TAG:凱哥java |