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

JVM内存模型

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

堆:

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

虚拟机栈:

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

本地方法栈:

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

程序计数器:

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

元空间:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值