JVM实战(17)——模拟对象晋升

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、简介

上一章,我们已经进行了一次Young GC日志的分析,本章我们继续结合代码示例做实验,来看看对象是如何从新生代进入老年代的。我们之前讲过新生代对象晋升到老年代的几种场景:

  • 躲过15次GC
  • 符合动态年龄判断规则
  • Young GC后存活对象放不进Survivor
  • 大对象直接进入老年代

本章,我们通过示例代码模拟最常见的一种场景——Young GC后存活对象放不进Survivor。

1.1 JVM内存参数

我们的示例程序基于JDK1.8,JVM参数如下:
-XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

上述给新生代分配了10MB空间,老年代也是10MB,参数注意两点:

  • -XX:PretenureSizeThreshold=10485760:超过10MB的大对象直接进入老年代
  • -XX:MaxTenuringThreshold=15:对象年龄到达15时进入老年代

二、示例程序

2.1 程序源码

示例程序代码如下:

    public class Demo1 {public static void main(String[] args) {byte[] array1 = new byte[2 * 1024 * 1024];array1 = new byte[2 * 1024 * 1024];array1 = new byte[2 * 1024 * 1024];byte[] array2 = new byte[128 * 1024];array2 = null;byte[] array3 = new byte[2 * 1024 * 1024];}}

2.2 JVM内存模型

我们根据上述代码来分析下内存中的对象分配。首先连续创建了三个2MB的数组对象,将array1指向最后一个数组对象,然后创建了一个128KB的数组,将array2赋null:

注意,Eden区里会有一些“未知对象”,根据模拟Young GC一文中的分析,对象大小在500KB左右,我们后续会通过工具分析这些“未知对象”到底是什么。

然后,执行代码byte[] array3 = new byte[2 * 1024 * 1024],希望在Eden区继续创建一个2MB的数组。显然,Eden区的空间不足了,此时就会触发Young GC。

2.3 程序执行

我们执行程序,得到以下GC日志:

    0.352: [GC (Allocation Failure) 0.353: [ParNew: 8106K->623K(9216K), 0.0021991 secs] 8106K->2673K(19456K), 0.0033689 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heappar new generation   total 9216K, used 2837K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)eden space 8192K,  27% used [0x00000000fec00000, 0x00000000fee297c0, 0x00000000ff400000)from space 1024K,  60% used [0x00000000ff500000, 0x00000000ff59be50, 0x00000000ff600000)to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)concurrent mark-sweep generation total 10240K, used 2050K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)Metaspace       used 3147K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 343K, capacity 388K, committed 512K, reserved 1048576K

三、日志分析

我们先来看下日志中的下面这行,这是本次GC情况的概要说明:

    0.352: [GC (Allocation Failure) 0.353: [ParNew: 8106K->623K(9216K), 0.0021991 secs] 8106K->2673K(19456K), 0.0033689 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

ParNew: 8106K->623K(9216K): 可以看到,本次Young GC后,新生代只剩下了623KB(未知对象)。但是明明array1还引用着一个2MB的数组:

我们注意下Survivor的大小,只有1MB,是容纳不下2MB数组和未知对象的。根据“Young GC后存活对象放不进Survivor会进入老年代”规则,ParNew会将2MB数组转移到老年代,未知对象转移到Survivor:

通过观察GC日志,也印证了这一点:
from space 1024K, 60% used: Survivor中有600多KB的数据,就是未知对象;
concurrent mark-sweep generation total 10240K, used 2050K: 老年代中的2MB对象就是array3引用的数组对象。

四、总结

本章通过GC日志分析了一种新生代对象进入老年代的示例,即Young GC后存活对象放不进Survivor,则会进行老年代。
需要注意的是,并不是所有存活对象都会进入老年代,可能会有部分对象留在Survivor区,部分对象进入老年代。

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

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

相关文章

django中orm模型类多种用法

模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表。 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model模型类的每个属性都相当于一个数据库的字段。利用这些,Djang…

(每日持续更新)jdk api之FileInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

将PDF发票转换为excel、xml结构化数据的完美解决方案

随着电子发票的普及,越来越多的企业和个人开始使用PDF格式的电子发票。然而,有时我们需要将电子发票转换为XML格式以便于处理和分析。本文将介绍如何将收到的PDF发票下载为excel、xml文件。首先,我们需要明确一点,PDF是一种基于图…

1. FPGA概述

文章目录 1. 什么是FPGA2. 学习FPGA有什么用3. 学习FPGA需要何种先决条件 1. 什么是FPGA 这个问题太low了,身处数字时代,从事电子信息行业,居然不知道FPGA?岂非笑谈? 介绍FPGA的资料太多了,还是从它的字面…

Could NOT find Threads (missing: Threads_FOUND)

具体错误 -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for…

C#编程-属性和反射

属性和反射 属性是将元数据信息和行为添加到应用程序代码中的简单技术。属性是允许您将声明信息添加到程序的元素。此声明信息在运行时用途广泛,可使用应用程序开发工具在设计时使用。 介绍属性 对象是由其属性值描述的。例如,汽车可以使用它的构造、型号或颜色来描述。类似…

ART-Adversarial Robustness Toolbox检测AI模型及对抗攻击的工具

一、工具简介 Adversarial Robustness Toolbox 是 IBM 研究团队开源的用于检测模型及对抗攻击的工具箱,为开发人员加强 AI模型被误导的防御性,让 AI 系统变得更加安全,ART支持所有流行的机器学习框架 (TensorFlow,Ker…

SpringMVC RESTful案例

文章目录 1、准备工作2、功能清单3、具体功能:访问首页a>配置view-controllerb>创建页面 4、具体功能:查询所有员工数据a>控制器方法b>创建employee_list.html 5、具体功能:删除a>创建处理delete请求方式的表单b>删除超链接…

Web3社交治理:用户参与决策的新模式

Web3时代的到来不仅仅带来了区块链技术的创新,还为社交治理带来了全新的模式。传统社交平台上的决策权通常集中在平台的运营方,而Web3社交治理的兴起意味着用户能够更直接地参与到社交平台的决策过程中。本文将深入探讨Web3社交治理的背景、工作原理以及…

帆软笔记-决策表报对象使用(两表格联动)

效果描述如下: 数据库中有个聚合商表,和一个储能表,储能属于聚合商,桩表中有个字段是所属聚合商。 要求帆软有2个表格,点击某个聚合商,展示指定的储能数据。 操作: 帆软选中表格单元&#xf…

C语言实现动态数组

1.mj版本的动态数组 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define DEFAULT_CAPACITY 10 #define ELEMENT_NOT_FOUND -1 // 定义全局变量 // 数组元素个数 int size 0; // 初始化动态数组 int* initArray(int capacity) {// 如果…

es5和es6的区别

ES5 和 ES6 的区别 ECMAScript5&#xff0c;即 ES5&#xff0c;是 ECMAScript 的第五次修订&#xff0c;于 2009 年完成标准化 ECMAScript6&#xff0c;即 ES6&#xff0c;是 ECMAScript 的第六次修订&#xff0c;于 2015 年完成&#xff0c;也称 ES2015 ES6 是继 ES5 之后的一…

SpringBoot 入门教程

1.复习SSM项目中&#xff0c;用spring&#xff0c;mybatis,springmvc这三个框架整合的项目。 SSM项目的所有类&#xff0c;这是用SSM整合一个搜索书籍种类和呈现的前端和后端的ssm的小项目。 2.springboot如何去开发这个页面&#xff1a; 新建springboot项目&#xff0c;勾选对…

<软考高项备考>《论文专题 - 68 质量管理(7) 》

7 管理关系论文解析 7.1 项目质量与进度、成本、范围之间的密切关系。&#xff08;2018年上&#xff09; 在项目管理三角形中&#xff0c;质量位于进度&#xff0c;成本&#xff0c;范围的中间的位置。 规划质量管理的输入中有需求文件&#xff0c;也就是说先有范围有需求的基…

MeshLab生成分形地形

文章目录 分型地形脊状多重分形其他地形 分型地形 分形地形是一种较为复杂的几何对象&#xff0c;MeshLab提供了下列五种地形生成算法&#xff0c;并且贴心地给出了每种算法相对较好的参数。 算法SeedOctaves缺项性分形增量偏移增益fBM(fractal Brownian Motion)11021.2--Sta…

【WPF.NET开发】WPF中的版式

本文内容 改进的文本质量和性能丰富的版式增强的国际文本支持增强的字体支持新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。…

VUE好看的个人博客源码

文章目录 1.设计来源1.1 首页界面1.2 我的日记界面1.3 我的文章界面1.3.1 文章列表1.3.2 文章时间轴1.3.3 文章详细 1.4 我的相册界面1.5 我的源码界面1.6 认识我界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https:/…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…

【计算机组成原理】期末复习试卷

目录 第一套试卷 第一套答案 第二套试卷 第二套答案 第三套试卷 第四套试卷 剩余试卷下载 第一套试卷 一、选择题&#xff08;共20分&#xff0c;每题1分&#xff09; 1&#xff0e;冯诺伊曼机工作方式的基本特点是______。 A&#xff0e;多指令流单数据流&#xff1b; B&#…

C++八股2

虚拟内存 虚拟内存是计算机系统内存管理的一种技术&#xff0c;它为每个进程提供一个独立的、连续的地址空间&#xff0c;即使物理内存有限或不连续。在C编程中&#xff0c;操作系统通过页表将虚拟地址映射到物理内存地址上。当程序试图访问不在物理内存中的虚拟地址时&#xf…