JVM内存溢出(三)之JVM8内存模型

JVM内存模型

Java8的JVM内存模型包括,堆、栈、程序计数器以及元空间。栈可分为Java虚拟机栈和本地方法栈。其中堆和元空间是线程共享的,而Java虚拟机栈、本地方法栈、程序计数器是线程隔离的。

JVM内存溢出(三)之JVM8内存模型_第1张图片

堆:

堆是一个所有线程共享的,存放对象的区域,也是GC的主要区域。其中的分区分为新生代,老年代。新生代中又可以细分为一个Eden,两个Survivor区(From,To)。Eden中存放的是通过new 或者newInstance方法创建出来的对象,绝大多数都是很短命的,正常情况下经历一次gc之后,存活的对象会转入到其中一个Survivor区,然后再经历默认15次的gc,就转入到老年代,这是常规状态下。在Survivor区已经满了的情况下,JVM会依据担保机制将一些对象直接放入老年代。当一个对象占用内存特别大的时候会直接放入老年代。

虚拟机栈:

Java虚拟机会为每个线程分配一个虚拟机栈,Java虚拟机栈是线程私有的。每个虚拟机栈中都有若干个栈帧,一个栈帧就对应Java代码中的一个方法。当线程执行到一个方法时,就代表这个方法对应的栈帧已经进入虚拟机栈并且处于栈顶的位置(先入后出),每一个Java方法从被调用到执行结束,就对应了一个栈帧从入栈到出栈的过程。每个栈帧中存储了局部变量表、操作数栈、动态链接、返回地址等。

本地方法栈:

本地方法栈与Java虚拟机栈的区别是,虚拟机栈执行的是Java方法,本地方法栈执行的是本地方法(Native Method)

程序计数器:

程序计数器主要用来确定指令的执行顺序,比如循环,分支,跳转,异常捕获等。JVM对于多线程的实现是通过轮流切换线程实现的,为了保证每个线程都能按正确顺序执行,将程序计数器作为线程私有。程序计数器是一块非常小的内存空间,可以看做是当前线程执行字节码的行号指示器。程序计数器是Java虚拟机规定的唯一不会发生内存溢出的区域。

元空间:

用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码缓存等

你可能感兴趣的:(JVM,jvm)