JVM内存管理1
Posted tjqblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM内存管理1相关的知识,希望对你有一定的参考价值。
程序计数器
作用:1 字节码解释器工作时通过修改计数器的值来选择下一条需要执行的字节码指令,因为虚拟机是通过多线程来切换并分配处理器执行时间的方式来执行的,因此 为了线程切换后能恢复到正确的位置,每一个线程需要有一个独立的程序计数器,各个计数器互不影响,在线程内独立存储。
虚拟机栈
和程序计数器一样,虚拟机栈也是线程私有的,其生命周期与线程一样每个方法在执行的同时都会创建一个栈帧,栈帧用于存储 局部变量表,操作数栈,动态链接 方法出口等等。每个方法从开始到完结 就对应了栈帧在虚拟机栈的入栈与出栈过程。
局部变量表所需要的内存空间在编译器完成分配,是完全确定的 ,运行时不会改变局部变量表的大小。
虚拟机中的两种异常:StackOverFlowError和OutOfMemoryError。
StackOverFlowError:如果线程请求栈帧的深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常。
OutOfMemoryError: 如果虚拟机栈客园扩展(大部分虚拟机都可以动态扩展),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
2种异常的理解:StackOverFlowError 就是递归的太深了 比如 自己调用自己
public class StackOverflowTest { public static void main(String[] args){ method(); } private static void method() { method(); } }
OutOfMemoryError:表示创建对象的速度快于JVM回收空间,就会发生这个异常,比如死循环创建对象
public class OutOfMemoryTest { public static void main(String[] args){ List<Object> list = new ArrayList<Object>(); while(true){ int[] index = new int[20_0000_0000]; list.add(index); } } }
本地方法栈
本地方法栈和Java虚拟机栈实现的功能类似,只不过本地方法区是本地方法运行的内存模型,本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表等等。
以上是关于JVM内存管理1的主要内容,如果未能解决你的问题,请参考以下文章