深入浅出JVM-GC过程

深入浅出JVM-GC过程

  • Minor GC
  • 对象进入老年代的4种情况
  • Full GC
  • 空间分配担保

Minor GC

  • Minor GC过程
    假设现在Heap内存大小为20M,其中年轻代为10M,老年代为10M,年轻代中Eden区6M,From区2M,To区2M,新创建的对象首先往Eden区分配,当再次分配一个对象,假设大小为1M,此时Eden区已经没有足够空间来给这个对象分配内存,如图所示:

在这里插入图片描述
这时候触发一次Minor GC,把Eden区的存活对象转移到From区,非存活对象进行清理,然后给新创建的对象分配空间,存入Eden区

在这里插入图片描述

随着分配对象的增多,Eden区的空间又不足了:

在这里插入图片描述
这时候再触发一次Minor GC,清理掉Eden区和S1区的死亡对象,把存活对象转移到S2区,然后再给新对象分配内存:

在这里插入图片描述
From区和To区是相对的关系,哪个区中有对象,哪个区就是From区,比如,再进行一次Minor GC,会把存活对象转移到S1区,再为转移之前,S2区是From区,S1区是To区,转移后,S2区中没有存活对象,变为To区,而S1区变为From区:
在这里插入图片描述

对象进入老年代的4种情况

  1. 假如进行Minor GC时发现,存活的对象在ToSpace区中存不下,那么把存活的对象存入老年代在这里插入图片描述

  2. 大对象直接进入老年代
    假设新创建的对象很大,比如为5M(这个值可以通过PretenureSizeThreshold这个参数进行设置,默认3M),那么即使Eden区有足够的空间来存放,也不会存放在Eden区,而是直接存入老年代在这里插入图片描述

  3. 长期存活的对象将进入老年代
    此外,如果对象在Eden出生并且经过1次Minor GC后仍然存活,并且能被To区容纳,那么将被移动到To区,并且把对象的年龄设置为1,对象没"熬过"一次Minor GC(没有被回收,也没有因为To区没有空间而被移动到老年代中),年龄就增加一岁,当它的年龄增加到一定程度(默认15岁,配置参数-XX:MaxTenuringThreshold),就会被晋升到老年代中

  4. 动态对象年龄判定
    还有一种情况,如果在From空间中,相同年龄所有对象的大小总和大于From和To空间总和的一半,那么年龄大于等于该年龄的对象就会被移动到老年代,而不用等到15岁(默认):
    在这里插入图片描述

Full GC

如果某个(些)对象(原来在内存中存活的对象或者新创建的对象)由于以上原因需要被移动到老年代中,而老年代中没有足够空间容纳这个(些)对象,那么会触发一次Full GC,Full GC会对整个Heap进行一次GC,如果Full GC后还有无法给新创建的对象分配内存,或者无法移动那些需要进入老年代中的对象,那么JVM抛出OutOfMemoryError

空间分配担保

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlerPromotionFailure这个参数设置的值(true或flase)是否允许担保失败(如果这个值为true,代表着JVM说,我允许在这种条件下尝试执行Minor GC,出了事我负责)。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者HandlerPromotionFailure为false,那么这次Minor GC将升级为Full GC
如果老年代最大可用的连续空间大于历次晋升到老年代对象的平均大小,那么在HandlerPromotionFailure为true的情况下,可以尝试进行一次Minor GC,但这是有风险的,如果本次将要晋升到老年代的对象很多,那么Minor GC还是无法执行,此时还得改为Full GC。
HandlerPromotionFailure为true时,如果某次需要转移到老年代中的对象确实很多,老年代无法容纳,那么也会先尝试进行一次Minor GC,Minor GC无法执行时再进行Full GC,这样虽然绕了圈子,但我们还是建议把这个参数设置为true,因为我们要尽量避免Full GC。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作324:uni-时间过滤器封装

filters: {toChangeDate(e) {console.log(new Date(e).getFullYear())console.log(new Date(e).getMonth())console.log(new Date(e).getDay())let dateYear new Date(e).getFullYear(); //获取年 let dateMonth new Date(e).getMonth()1<10? 0 new Date(e).getMonth() …

[Python] 制作启动uiautomator2 的web版 uiautomatorviewer2 批处理启动

打开一个txt文件&#xff0c;复制如下命令进行并另存为为 .bat文件 1 echo on 2 echo 正在启动 uiautomatorviewer2 3 4 python -m weditor 5 6 echo off 注意&#xff1a;如果批处理里面有中文的话&#xff0c;一定要将 txt 文本的编码方式设置为 ANSI 编码进行保存&#xf…

微信小程序获取unionid为空

微信小程序获取unionid为空原因&#xff1a;未绑定微信开放平台绑定步骤原因&#xff1a;未绑定微信开放平台 最新在调试一个新的微信小程序&#xff0c;因为要对web授权登录、app授权登录、小程序授权登录&#xff1b;几种登录场景根据unionid来开放登录。但是授权出现获取un…

《精通Python设计模式》学习之原型模式

暂时在工作中&#xff0c;还没有用到呢~~~ 以后要留意一下&#xff0c;主要用于复制对象副本&#xff0c; 然后又有自定义属性的地方。 import copy from collections import OrderedDictclass Book:def __init__(self, name, authors, price, **rest):self.name nameself.aut…

alipay.data.bill.balance.query ISV权限不足

alipay.data.bill.balance.query ISV权限不足alipay.data.bill.balance.query是支付宝商家账户当前余额查询接口&#xff1b;目前调用该接口返回 ISV权限不足 完整返回&#xff1a; {"body":"{"alipay_data_bill_balance_query_response":{"cod…

洛谷 P1063 能量项链 区间dp

洛谷 P1063 题意&#xff1a;在一串项链中&#xff0c;是环状的&#xff0c;第 i 颗珠子有两个能量a[i]和a[i1],第i1颗珠子有两个能量a[i1]和a[i2],可以合并两个珠子&#xff0c;得到a[i]*a[i1]*a[i2]的能量&#xff0c;这两个珠子合并成a[i]和a[i2]的新珠子&#xff0c;问通过…

支付宝第三方授权登陆

支付宝微信第三方软件的接入&#xff0c;也是越来越流行&#xff0c;最近也稍微研究了一下&#xff0c;支付宝和微信的登陆接入。 由于本人是做Java后台发开的&#xff0c;所以前端app集成没有涉及&#xff0c;研究的是网页和后台部分。 做第三方软件的​接入&#xff0c;…

解决IntelliJ创建Maven项目一直显Loading archetype list

最近在使用idea的过程中&#xff0c;创建maven项目&#xff0c;一直会遇到这个问题&#xff0c;查了很多资料&#xff0c;最终解决啦。 网上普遍存在两种方式 但是我是用第三种方式解决的..... 首先&#xff0c;说说前两种方式&#xff0c; 1.删除{User_Home}/.IntelliJIdea{V…

flex布局-笔记

一 、flex布局 弹性布局&#xff0c;灵活性 .box{display: flex;display: -webkit-flex; /* Webkit内核的浏览器&#xff0c;必须加上-webkit前缀。 */ /* 行内元素也可以使用弹性布局。 display: inline-flex;*/ /*弹性布局后&#xff0c;子元素的float、clear和vertical-ali…

​​使用win7超级终端连接华为交换机并配置端口镜像

​ 首先&#xff0c;用console连接主机和交换机&#xff0c;打开超级终端&#xff0c;&#xff08;注意&#xff1a;一定要用win7系统配置&#xff09;如图所示&#xff1a; ​ ​ 新建连接时名字随意&#xff0c;但要注意不能是下面图标&#xff1a; ​ 然后出现下面这…

电脑安装打印机设备搜索不到解决记录

下面以windows10举例&#xff0c;打印机设备为HP品牌 1.打开控制面板选择查看打印机设备&#xff0c; 选择添加打印机&#xff0c;搜索不出的时候选择我所需的打印机未列出 选择第三个选项&#xff1a;使用TCP/IP地址或主机名添加打印机&#xff0c;点击下一步 填写打印机主机名…

用原生PHP做Blog系统-Day01

目标 用原声PHP&#xff0c;不用框架&#xff0c;写一个博客发布系统&#xff0c;后台管理文章&#xff0c;用户&#xff0c;前台展示。 技术栈 PHPAJAXJavaScript JQueryHTML前端 WordPress阿里百秀模板 后端样式 转载于:https://www.cnblogs.com/huxiaoyi/p/9445565.html

支付宝APP支付 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足

首先&#xff0c;你得搞清楚支付方式&#xff1a; 支付宝支付分为&#xff1a;APP支付 以及 网站支付 两种&#xff0c;所以你要去确认你签约的到底是哪种。 于是&#xff0c;如果签约与调用的一致 解决办法&#xff1a; 登录开放平台 -> 研发管理-> 我的应用->…

elasticSearch的安装步骤~

Elasticsearch是一个实时的分布式搜索和分析引擎&#xff0c;关于elasticsearch和solr的比较和使用场景请自行百度。 1. 机器环境 Centos6.5 jdk-8u121-linux-x64.tar.gz elasticsearch-5.2.2.tar.gz 2. 配置(1). 配置静态ip (2). 进入cd /usr/local/src 在src目录下创建文件…

elasticSearch5.x与mysql数据库同步

ElasticSearch安装就不说了上一篇有说&#xff01; 安装logstash 官方&#xff1a;https://www.elastic.co/guide/en/logstash/current/installing-logstash.html 1.下载公共密钥rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch2.添加yum源vim /etc/yum.rep…

JZOJ5776. 【NOIP2008模拟】小x游世界树

题目&#xff1a;【NOIP2008模拟】小x游世界树&#xff1b; 题目的附加题解给的很清楚&#xff0c;这里只给一个代码&#xff1b; 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<cmath>5 #include<algorithm>6 #define…

elasticsearch解决同步删除数据库中不存在的数据

摘要: jdbc-input-plugin 只能实现数据库的追加&#xff0c;对于 elasticsearch 增量写入&#xff0c;但经常jdbc源一端的数据库可能会做数据库删除或者更新操作。这样一来数据库与搜索引擎的数据库就出现了不对称的情况。当然你如果有开发团队可以写程序在删除或者更新的时候同…

今天读了JDK1.8源码,知道了并行迭代器Spliterator

在JDK1.8的ArrayList里面偶然看到了这个内部类&#xff0c;同时对比了1.7的版本&#xff0c;发现1.7并没有这后面的东西&#xff0c; 随着好奇心&#xff0c;就搜了一下下&#xff0c;发现很有意思~ 也查了一些资料&#xff0c;如下总结&#xff1a; Spliterator是什么&#…

牛客网挑战赛24 青蛙(BFS)

链接&#xff1a;https://www.nowcoder.com/acm/contest/157/E来源&#xff1a;牛客网 有一只可爱的老青蛙&#xff0c;在路的另一端发现了一个黑的东西&#xff0c;想过去一探究竟。于是便开始踏上了旅途 一直这个小路上有很多的隧道&#xff0c;从隧道的a进入&#xff0c;会从…

20.pipe

pipe相当于angular1里面的filter 做一些格式转换啊&#xff0c;或者从一个数组里面选取一个元素等等 只要你愿意可以定义很复杂的内容‘’ 我们先看看 angular2 里面自带的一些pipe 我们去我们的week3 下的problem-list下 我们到html里面 之前是这样的 之后是这样的 我们再写三…