运行时数据区:方法区,堆,虚拟机栈,PC(程序计数)寄存器,本地方法栈
方法区和堆是线程共享的,其它为线程私有java
方法区存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中经过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在必定的条件下它也会被GC,当方法区域须要使用的内存超过其容许的大小时,会抛出OutOfMemory的错误信息。服务器
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;
JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减小堆直到 -Xms的最小限制。
所以服务器通常设置-Xms、-Xmx相等以免在每次GC 后调整堆的大小。
对象的堆内存由称为垃圾回收器(GC)的自动内存管理系统回收。 spa
虚拟机栈是线程私有的,每一个线程建立的同时都会建立JVM栈,
JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,
非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
线程