jvm内存分布图
- 线程独有内存:程序计数器,虚拟机栈,本地方法
- 非线程独有:方法区,堆
- 程序计数器:用于记录当前线程的字节码行数,是线程独有,该内存区域是Java虚拟机唯一没有规定任何OutOfMemoryError的区域。
- 虚拟机栈:用于存储局部变量,是线程独有,局部变量是在编译的时候已经确认后,方法运行时候的栈是已经确认好的。虚拟机栈规定了2种异常情况,一种是线程请求栈的深度大于虚拟机栈所允许的深度,这时候将会抛出StackOverflowError异常,如果当Java虚拟机允许动态扩展虚拟机栈的时候,当扩展的时候没办法分配到内存的时候就会报OutOfMemoryError异常。
- 本地方法栈:与虚拟机栈类似,只是本地方法执行native方法。
- 堆:存储所有线程的共享对象实例,可以动态扩展,当没有内存进行扩展的时候,堆抛出OutOfMemoryError异常。
- 方法区:这个也是线程共享的内存区域,存储被虚拟机加载的类信息、常量、静态变量、即时编译的代码数据等。方法区一般很少回收,经常被称为永久区,但也是可以被回收,主要针对常量与类型的卸载。在方法区也规定当方法区无法满足内存分布的时候,将会抛出OutOfMemoryError异常
-
虚拟机堆栈参数设置
-
-Xss 每个栈的大小
-Xms 初始化堆大小,-Xmx 最大堆大小