Eden Space 新生区(heap):内存最初从这个线程池分配给大部分对象。
Survivor Space 幸存区(heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。对象在Survivor区域中每熬过一次Minor GC 年龄会增加1岁 当达到一定程度会晋升到老年代中。(通过MaxTenuringThreshold设置晋升老年代的年龄阈值)
Tenured Generation 老年代(heap):用于保持已经在survivor space内存池中存在了一段时间的对象。(通过参数可以配置幸存区中坚持几次没有收回后放入老年代)
Permanent Generation 永久带(non-heap):保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象,属于类的(静态的)属性和字符串常量等。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。
Code Cache 代码缓存区(non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。
Jvm Stack 虚拟机栈:放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。
Local Method Statck 本地方法栈:放着本地方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。
程序计数器:是一块较小的内存空间,可以看做当前线程执行的字节码行号指示器。
通过改变这个计数器的值来选取下一趟需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能实现的依赖。
*各线程的计数器独立存储,互不干扰。“线程似有”的内存。
java虚拟机栈:同程序计数器也是线程私有的,生命周期与线程相同。
描述java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每个方法从调用直至执行完成的过程,就对应着一个站帧在虚拟机栈中入栈道出栈的过程。
局部变量表存放了编译期可知的基本数据类型、对象引用(对象起始地址的引用指针)
*其中long和double类型数据占用2个局部变量空间(slot),其余数据占用1个局部变量空间(slot)。
局部变量表所需内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配具体变量空间,在方法执行期间不会改变局部变量表大小。
在java虚拟机规范中对这个区域规定2中异常状况:
1.如果线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError异常。
2.如果虚拟机栈动态扩展时无法申请到足够的内存,抛出OutOfMemoryError异常。
本地方法栈:与虚拟机栈所发挥的作用相似,区别在于虚拟机为虚拟机执行Java方法服务,本地方法栈则为虚拟机实用到的Native方法服务。
同Java虚拟机栈抛出StackOverflowError和OutOfMemoryError异常。
Java堆:是被所以线程共享的一块内存区域,在虚拟机启动时创建,负责分配对象实例。
由于收集器采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代;
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
与堆区分开的原因和GC分代收集算法有关。(因为GC是按照分代收集算法由于永久代不需要收回,GC主要负责收回堆中存放的新生代和老年代,但并非绝对,这个区分的弊端是容易遇到内存溢出问题,JDK1.7中已把放在永久带的字符串常量池移到堆中。)
对象的内存布局:在HotSpot虚拟机中,对象在内存中存储的布局分为对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头包含两部分信息,第一部分用于存储对象自身的运行时数据(哈希码),GC分代念了、锁状态标志。线程持有锁、偏向线程ID、偏向时间戳等。
另一部分是类型指针,即对象指向它的类元数据的指针。
JVM JDK自带调试命令
jps(JVM Process Status Tool) 查看正在运行的虚拟机进程jps -l 输出主类的全名。如果是jar包显示jar路径
jps -v 查看虚拟机进程启动时的参数
jstat(JVM Statistics Monitoring Tool)监视虚拟机运行状态信息。
jstat -gc 进程ID (间隔 次数 默认为查询一次)监视堆状态,包括Eden区(年轻带),两个Survivor区(幸存带),老年代,永久带的容量。已用空间,GC时间合计等信息。
jinfo(Configuration Info for Java)实时查看和调试虚拟机参数。
jinfo pid 查看进程的详细参数信息。
jmap(Memory Map for Java)命令用于生成堆转储快照
jhat(JVM Heap Analysis Tool)虚拟机堆转储快照分析工具
jstack(Stack Trace for Java)Java堆栈跟踪工具