jvm内存模型
1.程序计数器:每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。该内存区域是唯一一个在Java虚拟机规范中没有规定任何OOM(内存溢出:OutOfMemoryError)情况的区域。
2.虚拟机栈: 与程序计数器类似,虚拟机栈也是线程私有的,他的生命周期跟线程相同,是jvm运行时创建,方法在执行的时候都会创建一个栈帧,用于存放局部变量表,操作栈,方法出口等信息...方法的调用意味的不断的压栈,弹栈。
3.本地方法栈:线程私有,给线程调用本地方法(jni方法,由c/c++编写)
4.堆内存: 线程共享,是jvm中最大的一块内存区域,java运行时几乎所有创建的对象都存放于堆内存中,该区域也是垃圾回收器的重点观察对象,也被称为gc堆。
5.方法区:线程共享,也被称为永久代,主要用于存储被虚拟机加载的类信息,常量,静态变量等...
说到虚拟机栈与线程,下面看一下,虚拟机栈大小与线程数量之间的关系:
从jvm内存结构来看,可以理解为 jvm内存大小=堆内存大小+虚拟机栈内存大小*线程数量。
从数学的角度:
jvm内存大小不变 ,
当堆内存大小固定不变:
虚拟机栈内存越大,线程数量越少;
虚拟机栈内存越小,线程数量越多;
当虚拟机栈内存大小固定不变:
堆内存越大,线程数量越少;
堆内存越小,线程数量越多;