方法區是虛擬機規範定義的,是全部線程共享的內存區域,保存系統的類的信息。好比:類的字段、方法、常量池、構造函數的字節碼內容、代碼、JIT 代碼java
永久代、metaspace 是對方法區的實現。jvm
Hotspot 實行分代管理內存(新生代、老年代、永久代)ide
jdk8 實現方法區用 metaspace 堆外內存函數
虛擬機參數:spa
jdk1.7線程
-XX:PermSize=5M -XX:MaxPermSize=10M
3d
jdk1.8code
-XX:MaxMetaspaceSize=150M
blog
代碼內存
package com.mousycoder.mycode.thinking_in_jvm; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * 方法區溢出 * * @version 1.0 * @author: mousycoder * @date: 2019-06-22 15:44 */ public class PermgenOOM { public static void main(String[] args) throws InterruptedException { int i = 0; while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(User.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o,objects); } }); enhancer.create(); Thread.sleep(1000); } } } class User { private long id; private String name; }
jdk1.7
jdk1.8
感謝您的耐心閱讀,若是您發現文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,您的鼓勵是做者寫做最大的動力。
做 者 : @mousycoder