对于全部的java开发人员来讲,了解和熟悉JVM的内存结构是很是重要的,不管是对于开发时的一些参数说的设置仍是维护时的异常排查都有很大的帮助,下面咱们先来了解下JVM内存结构java
从JDK1.8开始,JVM内存结构发生一点变化多线程
程序计数器(Program Counter Register)是一块较小的内存空间,主要能够看做当前线程所执行的字节码的行号指示器。它会指示出下一条将要执行指令的地址。
ide
// VM Args: -Xss128k (将虚拟机栈设为128k大小)
public class Test {
public int length = 0;
public void stackLeak() {
length++;
stackLeak();
}
//运行下本代码会出先StackOverflowError
public static void main(String[] args) {
Test test = new Test();
try {
test.stackLeak();
} catch(Throwable e) {
System.out.println("stack length:" + test.length);
throw e;
}
}
}
复制代码
// VM Args:-Xss2M
public class JavaVMStackOOM {
private void dontStop() {
while (true) {
}
}
//运行本代码会出现OutOfMemoryError异常,可是运行此代码可能会致使Windows直接挂了,因此得注意,记得保存本身手头的工做再决定是否是运行
public static void main(String[] args) {
while(true) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
dontStop();
}
});
thread.start();
}
}
}
复制代码
//VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {
static class OOMObject {
}
//运行这段代码会出现OutOfMemoryError异常
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
while (true) {
list.add(new OOMObject());
}
}
}
复制代码
//VM args : -XX:PermSize=10M -XX:MaxPermSize=10M
public class JavaMethodAreaOOM {
public static void main(String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
}
复制代码
//VM args : -XX:PermSize=10m -XX:MaxPermSize=10m
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}
复制代码
本文主要总结了下JVM的内存结构以及每一个结构区相应的存放内容和溢出异常,不少只是借鉴于《深刻理解Java虚拟机++JVM高级特性与最佳实践这本书》,若是想更好的了解的朋友也能够去看看这本书,写的很好很详细!布局