Java内存区域与内存异常

参考:深入理解Java虚拟机 周志明

![](http://images2015.cnblogs.com/blog/575312/201705/575312-20170531203010274-1840860764.png)

方法区

- 线程共享,加载类信息、常量、静态变量、JIT后的代码,别名Non-Heap - 对于HotSpot,此又称永久代,其他JVM并不存在这个概念 - 不需要连续内存空间,可扩,可不GC,会抛出OutOfMemoryError

虚拟机栈

- 线程私有,描述方法执行内存模型,栈帧,方法执行对应一个栈帧入栈到出栈 - 局部变量表,基本类型,对象指针,编译期间完成分配 - 栈深度超过虚拟机深度-->StackOverflowError - 虚拟机栈动态扩展无法申请足够内存时-->OutOfMemoryError

本地方法栈

- 与虚拟机栈类似,本地方法区为Native方法服务

- 线程共享,所有对象实例和数组均在此,GC主要区域,也叫GC堆,会抛出OutOfMemoryError - 可以处于物理上不连续内存空间

程序计数器

- 小内存,当前线程字节码行号指示器,线程私有,无OutOfMemoryError区域

其他

- 运行时常量池 - 方法区一部分,存放Class文件编译时生成的各种字面量和符号引用,类加载后存放在此 - 动态性,如String的intern()-->如果池中有此字符串则返回代表该字符串的对象,否则在池中添加此String对象,并返回引用 - 直接内存 - JDK1.4引入基于通道Channel与缓冲区Buffer的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过DirectByteBuffer对象作为这块内存的引用 - 反射调用Unsafe实例allocateMemory()分配内存,只有rt.jar可直接访问,所以反射=。=

设置

 -Xms //堆最小值
 -Xmx //堆最大值
 -XX:+HeapDumpOnOutOfMemoryErro //内存溢出时Dump出内存堆

 -Xss //栈容量设置

 -XX:PermSize //方法区最小值
 -XX:MaxPermSize //方法区最大值

 -XX:MaxDirectMemorySize //直接内存,默认与-Xmx堆最大值一致
原文地址:https://www.cnblogs.com/lknny/p/6925790.html