JVM垃圾回收系列--内存模型/垃圾回收流程
原文网址:JVM垃圾回收系列--内存模型/垃圾回收流程_IT利刃出鞘的博客-CSDN博客
简介
本文介绍Java各个代的关系(内存模型)及垃圾收集流程。
内存模型
JDK8的内存模型
在Java中所有的垃圾收集问题几乎都是针对堆内存空间完成的,但是要想充分理解垃圾的收集流程,必须首先掌握Java堆内存的最初内存模型组成。如图1所示:
内存模型的变化
JDK1.8以前提共用永久代,而从JDK1.8后永久代被替换为元空间(MetaSpace)。在JDK1.8之前,HotSpot都在努力改变永久代的存储位置,例如,在JDK1.6时提供有永久代,到了JDK1.7时又将永久代的部分操作移交给了堆内存,而在JDK1.8时使用元空间代替了永久代。
JDK 1.8之前的内存模型如图2所示。
可以发现,在JDK1.8之前都会提供有永久代,此部分内存是不受GC控制的。在最初的设计中,都将方法区保存在了永久代,所以一旦方法执行中出现了内存不足的情况,将会抛出:“OutOfMemoryError:PermGen space”错误。同时Oracle也在考虑将HotSpot与JRockit(此虚拟机不存在永久代)两个虚拟机合二为一,所以此内存空间被元空间所替代。
垃圾收集流程
在整个Java內存模型中,主要有3块内存区:年轻代(Young)、老年代(Tenured)、元空间(MetaSpace),同时还会有几块动态调整的内存伸缩区(当几个内存区空间不足时动态扩充)。而JVM的内存回收就是对这几块空间的回收处理操作,对于内存分配与GC的执行流程如图3所示。
上图中的垃圾回收主要是针对年轻代(Eden+Survivor)与老年代(Tenured)完成的。
具体流程如下:
- 当使用关键字new创建一个新对象时,JVM会将新对象保存在Eden区,此时需要判断Eden区是否有空余空间。
- 如果没有,则会执行“MinorGC(年轻代GC)”。
- 如果有,则直接将新对象保存在Edeti区之内;
- 执行完“MinorGC”后会清除不活跃的对象,从而释放Eden区的内存空间,随后对Eden空间再次判断。
- 如果此时Eden区的空间依然不足,则会将部分活跃对象保存在Survivor区。
- 如果此时剩余空间可以直接容纳新对象,则会直接为新对象申请内存空间;
- 由于Survivor区也有对象会存储在内,所以在保存Eden区发送来的对象前首先需要判断其空间是否充足。
- 如果Suivivor有足够的空余空间,则直接保存Eden区晋升的对象。此时Eden区空间得到释放,随后可以在Eden区为新的对象申请内存空间。
- 如果Survivor区空间不足,则需要将Survivor区的部分活跃对象保存到Tenured区。
- Tenured区如果有足够的内存空间,则会将Survivor区发送来的对象进行保存。
- 如果此时Tenured区的内存空间也已经满了,则将执行“FullGC”(完全GC或称为MajorGC,其包括年轻代和老年代,相当于使用“Runtime.getRuntime().gc()”处理)以释放年轻代和老年代中保存的不活跃对象。
- 如果在释放后有足够的内存空间,Survivor将保存Eden发送来的对象,这样就可以在Eden区内有足够的内存保存新的对象。
- 此时,如果老年代的内存区也己经被占满,则会抛出“OutOfMemoryError(OOM错误)”,程序将中断运行。
可见,Java在每次创建对象时如果发现内存不足都会自动向其他区域延伸。为了提高性能,在实际应用中可能会开辟尽量大的内存空间,以实现更加合理的GC控制。
其他网址
《Java开发实战经典》=> 23.3 JVM垃圾收集
JVM垃圾回收系列--内存模型/垃圾回收流程相关推荐
- JVM 调优系列之图解垃圾回收
转载自 JVM 调优系列之图解垃圾回收 摘要: jvm必知系列,总结一些常见jvm回收机制,方便查阅 从这篇开始我们开始探讨一些jvm调优的问题.在jvm调优中一个离不开的重点是垃圾回收,当垃圾回收 ...
- JVM 优化实操 - 内存分配与回收策略
JVM 体系难学的一个地方就是理论一大堆,却难以实践.今天就尝试着在本地实践一把,体会 JVM 内存分配和垃圾回收的过程,尽可能的能够通过本地实际操作感受一下之前学习到的一些理论知识,作为一名初学者, ...
- java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...
在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...
- 深入浅出JVM内存模型+垃圾回收算法
文章目录 前言 JVM内存模型 1. 程序计数器(记录当前线程) 2. Java栈(虚拟机栈) 3. 本地方法栈 4. 堆 5.方法区 6.直接内存 JVM垃圾回收 垃圾判断标准 1. 引用计数法 2 ...
- 后端学习 - JVM(上)内存与垃圾回收
JVM 架构图 文章目录 一 JVM 简介 二 类加载子系统: 1 作用 2 类的三个加载过程 3 类加载器的分类 4 双亲委派机制 5 两个 class 对象为同一个类的必要条件 三 运行时数据区: ...
- jvm深入理解:内存分配与回收策略(优先在Eden分配、大对象直接进入老年代、长期存活的对象将进入老年代、动态对象年龄判定、空间分配担保)
出入:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存. 象的内存分配,从 ...
- JVM运行参数_JVM内存模型_常用内存分析工具
JVM运行参数 常见标准参数 -showversion: 显示当前JVM版本等信息 -D设置系统属性参数: /*** 测试* @author regotto*/ public class JvmTes ...
- 【Java杂货铺】JVM#Java高墙之内存模型
Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 <深入理解Java虚 ...
- 【深入Java虚拟机JVM 03】Java内存模型
说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的 ...
最新文章
- [论文摘录] Classification of SOA Contract Specification Languages(ICWS, 2008), 第二部分
- 中国python之父是谁-Python之父:谈Python
- Leetcode 217. 存在重复元素 (每日一题 20210913)
- matlab调用q外部exe文件,Matlab GUI调用外部程序生成exe,DOS窗口输入问题
- 面向对象基础知识01
- 开启 NFS 文件系统提升 Vagrant 共享目录的性能
- 受iPhone 12销量变化影响 Q2柔性OLED面板出货量预计环比下滑35%
- 如何在spring框架中解决多数据源的问题[转]
- mysql 1.4安装步骤_1.4.1 MySql安装配置
- 3dmax入门学习丨3dmax如何做人物建模
- php的seeder是什么,Laravel框架使用Seeder实现自动填充数据功能
- windows server2012计算机管理“系统工具”里面没有“本地用户和组”怎么办?
- PyTorch多进程子进程瘫痪,解决办法
- 利用FDTD软件仿真拓扑光子(二)-光子晶体结构分析
- java --help_java help
- dcdc aam模式_AAM的完整形式是什么?
- 华为发布海思麒麟950:神兽决斗跑分琅琊榜,麒麟压得过骁龙?---ESM
- JavaScript Prototypes 原型 Lynda课程中文字幕
- svg 五花 元辅音 助读器
- 怎样用c语言禁止鼠标滑轮,如何禁用鼠标滚轮-禁用鼠标滚轮的教程 - 河东软件园...
热门文章
- Eclipse代码提示设置
- Virtual script not found, may missing <script lang=“ts“> / “allowJs“: true / jsconfig.json.volar
- 软件工程学习进度表(十四周)
- sew 31系列服务器报警12,SEW品牌变频器的MOVITRAC-31C系列故障代码详表
- 贴图、纹理、材质的区别是什么?
- 635头脑风暴创意法
- 连黄牛党都开始玩AI了,春节抢票不加钱是回不去了
- 回顾2018年十大AI新闻 中国继续占据主导优势
- Zebec Chain缘何能成为新晋应用链,熊市下又为何值得我们关注?
- Air780E|联通|雁飞格|AT命令|物联网|三元组|鉴权|算法|密钥生成|(4)-联通雁飞格物手动接入步骤