JVM02——JVM运行时内存
在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存。关注我的公众号「Java面典」了解更多 Java 相关知识点。
Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、Survivor From 区和 Survivor To 区,默认情况下年轻代按照 8 : 1 : 1 的比例来分配)和老年代。

新生代
- 新生代用来存放新创建的对象,默认占据堆 1/3 的空间;
- 由于新创建对象都会在新生代申请内存区域,所以会导致新生代会频繁触发 MinorGC。
Eden 区
Eden 区是大部分 Java 对象的初始创建区域(如果新创建的对象占用内存很大,将被直接分配到老年代)。
ServivorFrom
上一次 MinorGC 的幸存者,作为这一次 MinorGC 的被扫描区域。
ServivorTo
保留 MinorGC 过程中的幸存者。
MinorGC 实现过程(复制->清空->互换)
MinorGC 采用复制算法,其具体实现原理如下:
- Eden、ServicorFrom 对象复制到 ServicorTo,对象年龄 + 1。首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(
如果有对象的年龄达到了进入老年代的标准【对象年龄为 15 】,则复制到老年代),同时把这些对象的年龄 + 1(如果 ServicorTo 内存空间不够了,对象则会被复制到老年区); - 清空 Eden、ServicorFrom 中的对象。
- ServicorTo 和 ServicorFrom 互换。ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom 区。
老年代
- 老年代主要存放应用程序中生命周期长的内存对象;
- 老年代的对象比较稳定,所以 MajorGC 不会频繁执行。
老年代GC触发条件
- 当有新生代的对象复制进入老年代,空间不够用时才触发;
- 当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。
MajorGC实现过程
MajorGC 采用标记清除算法,其原理如下:
- 首先扫描一次所有老年代,标记出存活的对象;
- 然后回收没有标记的对象。
关于 MajorGC有以下几点需要您注意的:
- 由于要扫描再回收,所以 MajorGC 的耗时比较长;
- MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配;
- 当老年代也满了装不下的时候,就会抛出 OOM(Out Of Memory)异常。`
永久代
- 永久代指的是内存中永久保存的区域,主要存放 Class 和 Meta(元数据)的信息。
- JVM不会在主程序运行期间对永久代进行 GC 操作。所以这也导致了永久代的区域会随着加载的 Class 的增多而胀满,最终抛出 OOM 异常。
Java8 与元数据
在 Java8 中,已经没有了永久代的概念,而是出现一个新的被称为“元数据区”(元空间)的区域。元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:
- 元空间并不在虚拟机中,而是使用本地内存;
- 默认情况下,元空间的大小仅受本地内存限制;
- 类的元数据放入 Native Memory,字符串池和类的静态变量放入 Java 堆中,这样可以加载多少类的元数据就不再由 MaxPermSize 限制, 而由系统的实际可用空间来控制。
JVM系列推荐
JVM02——JVM运行时内存的更多相关文章
- JVM 运行时内存结构
1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space ...
- JVM运行时内存结构
原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- [转]JVM运行时内存结构
[转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...
- Jvm运行时内存解析
一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...
- 基础篇:JVM运行时内存布局
目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...
- 详细了解JVM运行时内存
详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...
- Java Core - JVM运行时内存管理
在读正文之前,阅读以下两篇博客学习并理解堆栈.作用域.本地方法的概念. 作用域:https://www.cnblogs.com/AlanLee/p/6627949.html 操作数栈:https:// ...
- JVM运行时内存区域
JVM运行java程序时会将内存划分为若干个不同的数据区域: (1)程序计数器: 1.占用内存空间不大. 2.程序计数器相当于JVM所执行的字节码(jvm指令)的“行号指示器”,通过程序计数器的“值” ...
随机推荐
- javaweb_forQuery
http://how2j.cn/k/tmall_ssm/tmall_ssm-1516/1516.html 总体思路 使用springMVC+spring+mybatis的方式打通表现层/业务层/持久层 ...
- Qt 获取当前时间
时间日期是经常遇到的数据类型,Qt 中时间日期类型的类如下: QTime:时间数据类型,仅表示时间,如11:12:13. QDate:日期数据类型,仅表示日期,如2011-11-11. QDateTi ...
- Trailing Zeroes (III) LightOJ - 1138 二分+找规律
Time Limit: 2 second(s) Memory Limit: 32 MB You task is to find minimal natural number N, so that N! ...
- Linux上的软件ClamAV
ClamAV是使用广泛且基于GPL License的开源代码的典型杀毒软件,它支持各种平台,如:windows.linux.Unix等操作系统,并被广泛应用于其他应用程序,如:邮件客户端服务器.HTT ...
- 深度学习之TensorFlow安装与初体验
深度学习之TensorFlow安装与初体验 学习前 搞懂一些关系和概念 首先,搞清楚一个关系:深度学习的前身是人工神经网络,深度学习只是人工智能的一种,深层次的神经网络结构就是深度学习的模型,浅层次的 ...
- TICA 2019 自动的自动化测试——智能化一站式的API测试服务
阿里QA导读:新奥集团中台的陈磊为我们打开了AI测试驱动的视野,同时也深入浅出地介绍了如何打造智能化API测试框架.通过陈磊老师的分享,我们看到了AI-DT的无限可能性.以后,AI能不能代替大部分手动 ...
- scrollIntoView 前的元素滚动到浏览器窗口的可视区域内 不止垂直滚动,还有水平滚动
Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内 element.scrollIntoView(); // 等同于element.scrollIntoVi ...
- HEALER
项目介绍: 专注是一款时间管理应用,可以帮你管理时间,制定计划,让你保持专注,从快节奏的当下抽离,进入另一个平和安静的时空,以获得更好的工作和学习效率. 主模块(专注):设置分类.专注时长.简介,点击 ...
- 查漏补缺:QObject类介绍
QObject是Qt对象模型的中心.这个模型的核心特征就是一种用于无缝对象间通信的被叫做信号和槽的非常强大的机制,可以使用connect()把信号和槽连接起来,也可以通过disconnect()来破坏 ...
- 某某项目SDV软件测试报告范例
说明:本范例为符合CMMI 5级要求的范例 Prepared by 拟制 小张 Date 日期 2008-04-09 Reviewed by 评审人 小丽.小王.小李.小莉.小三.小四.小猪.小猫.小 ...