java 内存区域
根据 java虚拟机规范 的规定,java虚拟机所管理的内存会包括以下几个运行时数据区域:堆,方法区,程序计数器,虚拟机栈,本地方法栈
程序计数器:当前线程所执行的字节码的行号,程序执行时根据行号获取下一条指令(通俗的讲,就是指令执行到什么位置)
因为java虚拟机多线程是CPU切换时间片执行,因此每个线程拥有自己的程序计数器,各个线程的程序计数器相互独立,这样在切换时间片执行相应线程时才能根据
自身的程序计数器恢复到正常状态,继续执行
java虚拟机栈:线程私有,生命周期与线程相同,主要作用是保存方法执行时的局部变量,所需内存大小在编译期间分配
本地方法栈:执行本地方法时保存本地方法产生的局部变量的内存(与java虚拟机栈的区别为:java虚拟机栈 是执行java方法时保存临时变量的空间)
当栈的深度超过虚拟机允许的最大深度时StackOverflowError(递归次数过多可能会产生这个问题),当栈空间无法扩展,超过限制时:OOM OutOfMemoryError
java堆:保存对象实例,数组, 线程共享
方法区:线程共享,存放 虚拟机加载的类信息,常量,静态变量