概念
方法區是虛拟機規範定義的,是所有線程共享的記憶體區域,儲存系統的類的資訊。比如:類的字段、方法、常量池、構造函數的位元組碼内容、代碼、JIT 代碼
永久代、metaspace 是對方法區的實作。
Hotspot 實行分代管理記憶體(新生代、老年代、永久代)
jdk8 實作方法區用 metaspace 堆外記憶體
方法區溢出
虛拟機參數:
jdk1.7
-XX:PermSize=5M -XX:MaxPermSize=10M
jdk1.8
-XX:MaxMetaspaceSize=150M
代碼
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
原文出處 : http://mousycoder.com/thinking-in-jvm/9/