堆(Heap):是Java虚拟机所管理的内存中最大的一块内存区域,用来存放实例对象及数组,但也不是所有的实例对象都存放在堆中。
- 堆的最小内存由-Xms指定,默认为物理内存1/64,当空余堆内存小于40%时,就会增大,直到-Xmx设置的堆内存,可以通过XX:MinHeapFreeRation指定堆最小内存。
- 堆的最大内存由-Xmx指定,默认为物理内存的1/4,当空余堆内存大于70%时,就会减小,直到-Xms设置的堆内存,可以通过XX:MaxHeapFreeRation指定堆最大内存。
当然为了避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。
堆内存 = 新生代+老生代+永久代。(持久代在物理层面,是在堆空间的;而在逻辑层面,是在方法区的;因为方法区其实物理上也是在堆中的,但是由于功能和作用的区别,逻辑上方法区是独立于堆的)新生代又分为Eden区、From Survivor(S0)区、To Survivor(S1)区。
方法区(Method Area):用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中,实际上方法区已经与Java堆分开了
虚拟机栈(JVM Stacks):每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。
虚拟机栈主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。
本地方法栈(Native Method Stacks):与虚拟机栈的作用类似,虚拟机栈是为虚拟机执行的java方法服务,本地方法栈是为虚拟机执行的native方法服务
程序计数器(Program Counter Register):存储当前线程所执行字节码的行号,用于当前线程中断执行后重新执行时找到原来执行到的位置