JVM-2

目录

1.虚拟机类加载机制

2.JVM常见回收算法

2.1标记清除算法

2.2标记整理算法

2.3标记复制算法

3.分代垃圾回收机制

新生代收集

第一次垃圾回收

第二次垃圾回收

第N此垃圾回收

老年代收集

4.补充

Stop The World

Java的对象结构


1.虚拟机类加载机制

双亲委派模式:即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器.

父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载.

优点:

  1. 避免类的重复加载
  2. 避免Java的核心API被篡改

2.JVM常见回收算法

常见的回收算法有三种:

  1. 标记清除算法
  2. 标记整理算法
  3. 标记复制算法

2.1标记清除算法

标记清除算法是最早出现的也是最基础的垃圾收集算法。

该算法可以分为两个阶段:标记---->清除

标记:把与 GC ROOT 没有关联的对象标记为垃圾

清除:把刚才标记的对象内存释放出来,然后放入空闲内存列表中,下次我们需要创建对象的时候就从空闲内存列表中进行使用。

缺点:

1、执行的效率极不稳定,当堆中有大量需要回收的对象这时候就需要做大量的标记和清除操作,标记和清除的执行效率随数量的增长而降低。

2、内存空间碎片化问题,标记、清除操作完之后会产生大量的不连续内存碎片,从而导致当程序中需要分配较大对象的时候无法找到足够的连续内存而不得不提前触发再一次垃圾收集动作。

2.2标记整理算法

该算法可以分为两个阶段:标记---->整理

标记:把与 GC ROOT 没有关联的对象标记为垃圾

整理:主要是解决标记清除算法出现的内存空间碎片化的问题,在清除垃圾的时候把内存整理好

标记整理算法在整理的过程中需要牵扯到对象的内存移动,必然这个效率肯定会比较低

2.3标记复制算法

该算法可以分为两个阶段:标记---->复制

标记:把与 GC ROOT 没有关联的对象标记为垃圾

复制:把不需要回收的对象复制到另一部分空闲的内存中,那么之前的那一块内存就都是垃圾,把之前整块都清空,然后交换位置,下次进行回收的时候进行同样的操作。

一般不会采用其中一种进行垃圾回收,而是采用分代回收机制

3.分代垃圾回收机制

现在大多商业jvm的垃圾收集器都遵循了分代收集的理论进行设计。
它把堆内存中的区域划分成两大块,一个叫新生代(Young Generation),一个叫老年代(Young Generation)两个区域,在新生代中每次垃圾收集时都发现有大量对象死去,然后每次回收后存活的少量对象逐步晋升到老年代中存放。
用完就能丢弃的对象就放在新生代中,长时间使用的对象就放在老年代中。这样就可以根据生命周期的不同特点使用不同的垃圾回收策略,老年代的垃圾回收很久才一次,新生代就会经常进行垃圾回收。
每个区域又分为三个部分:Eden(伊甸园)、幸存区 From、幸存区 To。

新生代收集

第一次垃圾回收

当我们创建一个对象的时候它最开始会创建在 Eden 中,之后会有越来越多的对象被创建在Eden 里,直至Eden内存被占用满这个时候就会出现一次垃圾回收,新生代的垃圾回收叫做 minor GC

minor GC流程就是先标记垃圾然后把垃圾清除,然后把存活的对象复制到幸存区To中并且会把幸存的对象寿命加1,并且会交换幸存区 From 和幸存区To,这就是第一次垃圾回收。

第二次垃圾回收

第一次垃圾回收完之后Eden区域又有剩余的内存可以使用了,这个时候我们又创建了很多新对象,并再一次把该区域占满。
触发垃圾回收,前部分都是一样,先标记清除,再复制到幸存区 To中,由于进行过交换这个时候的幸存区To就不是第一次垃圾回收的幸存区To了,而是第一次垃圾回收前的幸存区From。


再标记幸存区To中对象是否为垃圾,是垃圾就清除掉,不为垃圾就放入幸存区From中,并把对象寿命加1,再次交换幸存区 From 和幸存区To。

第N此垃圾回收

假设一个对象的寿命超过了一个域值了,就证明这个对象是比较有价值的,那么就会晋升到老年代中,新生代继续进行minor GC策略。

老年代收集

老年代垃圾收集Major GC或者称为Old GC,一般不会单独进行老年代垃圾收集,只有CMS收集器会进行单独收集老年代的行为。

老年代的收集算法不同于新生代,新生代主要采用复制算法,由于老年代的存过对象比较多整理起来或清除起来就会比较慢。这个要看各个厂商如何选择,一般为标记加清除算法或者标记加整理算法,效率上前者要大于后者

当新生代中对象年龄超过阈值时就会晋升到老年代中,最大寿命是15(因为每个对象的对象寿命都是保存在对象头中,保存寿命的大小是4bit,能标识的最大二进制为1111转换成十进制就是15) 但是不同的垃圾回收器对阈值的设定会不一样,当资源比较紧张时可能还没有到达15就会被放入至老年代中,所以15只是最大的阈值而不一定非要等到15才会晋升至老年代中。

当老年代中的对象不足以放下新生代晋升过来的对象时就会触发整理收集 Full GC

Full GC它会对整个Java堆和方法区进行垃圾回收,所以它的收集过程时间也会比较长,并且在收集过程中会出现 Stop The World。

4.补充

Stop The World

概念:进行垃圾回收的过程中,会涉及对象的移动。为了保证对象引用更新的正确性,必须暂停所有的用户线程,像这样的停顿,虚拟机设计者形象描述为「Stop The World」。也简称为STW。

不管是执行哪种垃圾回收机制都会触发 Stop The World

由于在执行垃圾回收的时候会进行内存对象的移动过程,这个过程中移动过的对象内存地址会发生改变,移动存活对象并更新所有引用这些对象的地方将会是一种极为负重的操作,而这种操作就必须暂停其它用户的线程或者说是暂停其它应用程序才能进行。

垃圾回收结束后才会恢复用户线程或者应用程序,新生代幸存的对象只有很少一部分所以新生代暂停时间较短,而老年代则相反暂停时间会较长。

Java的对象结构

Java对象由三个部分组成:对象头、实例数据、对齐填充。

对象头由两部分组成,

第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、 线程持有的锁、偏向线程ID(一般占32/64 bit)。

第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解STM32的低功耗模式

低功耗模式简介 TM32的低功耗模式是特别设计来减少微控制器在不活跃状态下的能耗。这些模式允许STM32在保持核心功能的同时尽可能减少电力消耗,适合用在电池供电或需长期运行的场景。理解各种低功耗模式如何节能,主要包括以下几个方面: 关闭…

DenseNet笔记

📒from ©实现pytorch实现DenseNet(CNN经典网络模型详解) - 知乎 (zhihu.com) 是什么之 DenseBlock 读图: x0是inputH1的输入是x0 (input)H2的输入是x0和x1 (x1是H1的输出) Summary: 传统卷积网,网…

C语言——函数指针——函数指针数组 (详解)

函数指针数组 函数指针数组的作用 函数指针数组是一个数组,其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量,可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。 函数指针数组的使用场景有很多&…

C++ Standard Library简介

目录 ​编辑 引言: Boost C Libraries:截至本文编写时间最新版本 1.84.0 STL源码分析: C STL源码分析(一):STL体系结构和一些基础知识 libc: 概述 libc 入门 现状 平台和编译…

BetterDisplay for mac V2.2.5 强大的mac显示器管理开源工具

BetterDisplay是Mac OS 一个很棒的工具! 它允许您将显示器转换为完全可扩展的屏幕 管理显示器配置覆盖 允许亮度和颜色控制 提供 XDR/HDR 亮度升级(Apple Silicon 和 Intel Mac 上兼容的 XDR 或 HDR 显示器的额外亮度超过 100% - 多种方法可用&#x…

【Linux】文件系统扩展——软硬链接

目录 对文件建立软硬链接 软链接 硬链接 对文件建立软硬链接 对 log 文件建立软链接: ln -s log log.soft.link 对 test 文件建立硬链接: ln test test.hard.link log.soft.link 和 test.hard.link 在 Linux 中都只是文件名,为了方便…

springboot整合shiro的实战教程(三)

文章目录 授权实现0.页面资源授权2.代码授权方式3.方法调用授权4.授权数据持久化5. 创建dao方法6.实现service接口7.修改自定义realm 授权实现 0.页面资源授权 <%taglib prefix"shiro" uri"http://shiro.apache.org/tags" %><shiro:hasAnyRoles…

Java对接(BSC)币安链 | BNB与BEP20的开发实践(二)BNB转账、BEP20转账、链上交易监控

上一节我们主要是环境搭建&#xff0c;主要是为了能够快速得去开发&#xff0c;有些地方只是简单的介绍&#xff0c;比如ETH 、web3j等等这些。 这一节我们来用代码来实现BNB转账、BEP20转账、链上交易监控 话不多说&#xff0c;我们直接用代码实现吧 1. BNB转账 /*** BNB转…

后端八股笔记-----mysql

Mysql 聚合查询————可以用增加一个实例表解决 多表查询————可以优化sql语句进行查询 &#x1f446; 显示Using index condition的话 说明是有优化的空间 &#x1f446;唯一索引指的是类似主键这种数据内容唯一的属性 &#x1f446;图中的最后一个sql的索引…

Math类 --Java学习笔记

Math 代表数学&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法 Math提供的常用方法

Kafka的分区机制

Kafka的分区机制是其核心功能之一&#xff0c;旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理&#xff1a; Kafka分区基本概念 分区&#xff08;Partition&#xff09;&#xff1a;Kafka中的主题&#xff08;Topic&#xff09;可以细分为多个分区…

OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】

package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量&#xff08;节点数&#xff09;int m sc.nextInt(); // 基站对数量&#xff08;边数&…

【Docker】在 Ubuntu20.04 上配置 Docker 开发环境

【Docker】在 Ubuntu20.04 上配置 Docker 开发环境 1 安装 Docker2 加入 Docker 用户组 1 安装 Docker 参考文档: Link 卸载以避免冲突 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done设…

linux中新添加一块硬盘之后,系统起不来

问题&#xff1a; 在添加磁盘之后&#xff0c;重新开机时&#xff0c;却发现无法进入系统中 原因&#xff1a; 是因为添加了新的磁盘之后&#xff0c;系统将空硬盘当作系统盘启动&#xff0c;所以无法启动系统 解决方案&#xff1a; 进入到bios&#xff0c;将系统盘的优先级…

【大厂AI课学习笔记NO.71】AI算力芯片GPU/TPU等

AI算力芯片的发展历程 人工智能&#xff08;AI&#xff09;算力芯片的发展历程紧密地跟随着AI技术的发展脚步。从早期的基于传统中央处理器&#xff08;CPU&#xff09;的计算&#xff0c;到图形处理器&#xff08;GPU&#xff09;的广泛应用&#xff0c;再到专门为AI设计的处…

01_electron入门

由于毕业论文可能需要用 electron&#xff0c;所以 Linux 驱动学习慢了下来。 一、安装 node.js 进入 node.js 官网&#xff1a;Node.js (nodejs.org) 咱们就是用稳定版&#xff0c;安装包除了安装路径自己选择外&#xff0c;一直点 Next。 安装完成后需要配置环境&#xff0c…

C++容器适配器stack、queue、priority_queue

文章目录 C容器适配器stack、queue、priority_queue1、stack1.1、stack的介绍1.2、stack的使用1.3、stack的模拟实现 2、queue2.1、queue的介绍2.2、queue的使用2.3、queue的模拟实现 3、priority_queue3.1、priority_queue的介绍3.2、priority_queue的使用3.3、仿函数3.4、pri…

Vue3+ts(day02:CompositionAPI、setup)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

Linux——信号

目录 什么是信号 Linux下的信号 信号的记录 信号处理的常见方式 产生信号 使用组合键产生信号&#xff08;包含core dump&#xff09; 使用系统调用向进程发送信号 由软件条件产生信号 由硬件异常产生信号 阻塞信号 内核表示 sigset_t 信号集操作函数 sigpendin…

基于粒子群(PSO)的PID控制器matlab仿真

算法实现简介 利用粒子群算法对 PID 控制器的参数进行优化设计&#xff0c;其过程如图 所示。 图中&#xff0c;粒子群算法与 Simulink 模型之间连接的桥梁是粒子&#xff08;即 PID 控制器参数&#xff09;和该粒子对应的适 应值&#xff08;即控制系统的性能指标&#xff09…