堆、棧、方法區堆關系
概述
-
方法區與堆區一樣,是各個線程共享的內存區域
-
方法區在JVM啟動時就會被創建,並且它的實際的物理內存空間中和Java堆區一樣都可以是不連續的
-
方法區的大小,跟堆空間一樣,可以選擇固定大小或者可拓展
-
方法區的大小決定了系統可以保存多少個類,如果系統定義了太多的類,導致方法區溢出,虛擬機同樣會拋出內存溢出錯誤:java.lang.OutOfMemoryError:PermGen space 或者 java.lang,OutOfMemoryError:Metaspace,比如:關閉JVM就會釋放這個區域的內存
-
加載大量的第三方jar包
-
Tomcat部署的工程過多
-
大量動態生成反射類
-
-
在jdk7及以前,習慣上把方法區稱為永久代,jdk8開始,使用元空間取代了永久代。元空間的本質和永久代類似,都是對JVM規范中方法區的實現。不過元空間與永久代最大的區別在於:元空間不再虛擬機設置的內存中,而是使用本地內存
-
本質上,方法區和永久代並不等價。僅是對hotSpot而言的。《java虛擬機規范》對如何實現方法區,不做統一要求。例如:BEA JRockit/IBM J9中不存在永久代的概念
-
使用永久代,會導致Java程序更容易OOM(超過-XX:MaxPermSize上限)
(Java7和Java8在方法區的實現)