一零六七、JVM梳理

 

JVM?

Java虚拟机,可以理解为Java程序的运行环境,可以执行Java字节码(Java bytecode)并提供了内存管理、垃圾回收、线程管理等功能

java内存区域划分?每块内存中都对应什么?

  • 方法区:类的结构信息、常量池、静态变量、即时编译器编译后的代码等。
  • 堆:对象实例(堆分为新生代和老生代,新生代对象变化频繁,经常触发GC,老生代变化较缓)。
  • 虚拟机栈:每个方法的局部变量表、操作数栈、动态链接、方法出口等。
  • 本地方法栈:本地方法的调用和执行状态。
  • 程序计数器:当前线程执行的字节码指令地址。

总结:   

        新生代又分为Eden空间、Survivor空间,Survivor空间又有Survivor1和Survivor2,大部分对象首先被分配到新生代的Eden空间,经过一次垃圾回收后,如果存活则进入Survivor空间,经过多次回收后仍然存活的对象会被晋升到老年代。

一个类的加载流程?

  1. 加载(Loading):加载是类加载的第一阶段。在此阶段,类加载器通过类的全限定名(Fully Qualified Name)来查找并读取类的字节码文件(通常是以.class文件形式存储的)。类加载器可以从文件系统、网络、JAR包等位置获取字节码文件的二进制数据,并将其转换成内部数据结构表示的类。

  2. 验证(Verification):验证是类加载的第二阶段。在此阶段,虚拟机会对字节码进行合法性校验,确保字节码符合Java语言规范和虚拟机规范,避免安全漏洞和不合规的字节码引起的问题。

  3. 准备(Preparation):准备是类加载的第三阶段。在此阶段,虚拟机为类的静态变量分配内存,并设置默认初始值(零值),例如0、null等。这些静态变量通常存储在方法区中。

  4. 解析(Resolution):解析是类加载的第四阶段。在此阶段,虚拟机会将类中的符号引用转换为直接引用。符号引用指向类、字段、方法等在运行时才能确定具体内存地址的符号,而直接引用则直接指向内存中的对象、方法等。

  5. 初始化(Initialization):初始化是类加载的最后一阶段。在此阶段,虚拟机会执行类的初始化代码,包括静态变量赋值和静态代码块的执行。初始化时,按照静态变量定义的顺序依次执行,并且是线程安全的。初始化完成后,类被标记为已初始化,可以使用了。

垃圾回收算法有哪些?

  • 标记清除法,首先,从根对象(gc root)开始标记所有可达对象,即从根对象出发遍历对象图,并给可达对象打上标记。然后,在清除阶段,遍历整个堆内存,将未标记的对象进行回收。标记-清除算法可以解决循环引用的问题,但容易产生内存碎片。
  • 标记整理法,为了解决复制和清除算法的缺陷,在回收垃圾后会向内存—边整理对象,这会栖牲比较多的性能。
  • 复制算法,该算法将内存分为两个区域,一半为活动区(From Space),一半为空闲区(To Space)。在垃圾回收过程中,将活动区中存活的对象复制到空闲区,并更新引用关系。最后,交换两个区域的角色,即将空闲区变为活动区,原活动区变为空闲区。该算法简单高效,但对内存利用率较低。
  • 分代算法,通常将新创建的对象放入新生代(Young Generation),经过多次垃圾回收仍存活的对象会被晋升到老年代(Old Generation)。新生代采用复制算法,而老年代采用标记整理算法。这样能够根据对象的特性进行不同的优化,提高垃圾回收的效率。

总结:

        标记删除,实现简单,但是删除过后容易产生内存碎片。复制算法,解决了内存碎片的问题,同是也是比较高效的回收算法,但是使用了比较高昂的内存空间作为代价。标记整理算法,为了解决复制和清除算法的缺陷,在回收垃圾后会向内存—边整理对象,这会栖牲比较多的性能。分代算法是把内存空间划分为不同代,新生代和老年代。每个代因其功能职责不同采用不同的垃圾回收算法,新生代因为对象朝生夕死所以采用复制算法,提高回收效率,老年代则采用标记整理。

什么是双亲委派机制?

当一个类加载器需要加载某个类时,它首先会将该请求委派给它的父加载器,只有在父加载器无法完成加载时,才由子加载器自行加载。

总结:

        通过双亲委派机制,Java类加载器构成了一个层次结构,形成了一种从上到下的类加载器链。这种结构保证了类的一致性和稳定性,并且可以防止用户自定义的类库覆盖Java核心类库的安全问题。当一个类被加载后,它会由加载它的类加载器和它的类本身共同确定其在虚拟机中的唯一性。

如何主动触发垃圾回收?

System.gc()方法是一个静态方法,它会通知JVM进行垃圾回收操作。实际上,这只是一个建议,具体是否进行垃圾回收还是取决于JVM的内部策略。JVM可能会选择立即执行垃圾回收,也可能会忽略该建议。

另外,Java虚拟机提供了一个Runtime类,它有一个gc()方法,与System.gc()具有相同的功能。你可以使用Runtime.getRuntime().gc()来调用垃圾回收。

需要注意的是,频繁地手动触发垃圾回收并不是一个好的做法。JVM通常会根据当前系统资源的使用情况和垃圾回收算法的策略自动进行垃圾回收,手动触发垃圾回收可能会导致不必要的性能开销。通常情况下,我们应该信任JVM的垃圾回收机制,并正确管理对象的生命周期,让JVM自己来决定何时进行垃圾回收。

什么是young GC?什么是full GC?什么是stw?
        young GC 就是新生代的垃圾回收,比较频繁,full GC是老生代的垃圾回收,效率比较低,并且会触发 stw,stw就是除了垃圾回收这个线程其他线程都停止。


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

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

相关文章

排序算法(九大)- C++实现

目录 基数排序 快速排序 Hoare版本(单趟) 快速排序优化 三数取中 小区间优化 挖坑法(单趟) 前后指针法(单趟) 非递归实现(快排) 归并排序 非递归实现(归并&am…

奥威BI—数字化转型首选,以数据驱动企业发展

奥威BI系统BI方案可以迅速构建企业级大数据分析平台,可以将大量数据转化为直观、易于理解的图表和图形,推动和促进数字化转型的进程,帮助企业更好地了解自身的运营状况,及时发现问题并采取相应的措施,提高运营效率和质…

【数据结构】双链表

【数据结构】双链表 一. 前言二. 带头双向链表接口实现1.准备工作2. 创建一个节点 三. 初始化4. 打印5. 尾插6. 尾删7. 头插8. 头删9. 计算节点个数10. 查找数据11. 在任意位置插入数据12. 在任意位置删除数据13. 销毁 四. 如何10分钟内完成一个完整双链表 一. 前言 带头双向循…

笔记——听听前辈们的教学评一体化

精选课程内容 强而有力的知识 做中学,用中学,创中学。 这个技术很难做 关于支架的新理解 有价值 有意义 和 趣味性 权衡,不能为了趣味性舍弃价值 举例说明文 被教成了文学作品 导致所教所学 悄然发生了偏移。 所以教学评如何一直&#xff…

Ajax 笔记(一)

笔记目录 1. Ajax 入门1.1 Ajax 概念1.2 axios 使用1.2.1 URL1.2.2 URL 查询参数1.2.3 小案例-查询地区列表1.2.4 常用请求方法和数据提交1.2.5 错误处理 1.3 HTTP 协议1.3.1 请求报文1.3.2 响应报文 1.4 接口文档1.5 案例1.5.1 用户登录(主要业务)1.5.2…

如何构造一个安全的单例?

为什么要问这个问题? 我们知道,单例是一种很常用的设计模式,主要作用就是节省系统资源,让对象在服务器中只有一份。但是实际开发中可能有很多人压根没有写过单例这种模式,只是看过或者为了面试去写写demo熟悉一下。那…

职责链模式(C++)

定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 应用场景 在软件构建过程中,一个请求可能被多个对象处理,…

Redis单机,主从,哨兵,集群四大模式

Redis 单机模式 Redis 单机模式是指 Redis 数据库在单个服务器上以独立的、单一的进程运行的模式。在这种模式下,Redis 不涉及数据分片或集群配置,所有的数据和操作都在一个实例中进行。以下是关于 Redis 单机模式的详细介绍: 单一实例&#…

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Po模型介绍 1、简…

24届华东理工大学近5年自动化考研院校分析

今天给大家带来的是华东理工大学控制考研分析 满满干货~还不快快点赞收藏 一、华东理工大学 学校简介 华东理工大学原名华东化工学院,1956年被定为全国首批招收研究生的学校之一,1960年起被中共中央确定为教育部直属的全国重点大学&#…

匈牙利算法详解

匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),用于求解指派问题(assignment problem),算法时间复杂度为O(N^3)。Harold Kuhn发表于1955年,由于该算法基于两位匈牙利数学家的早期研究成果&#…

基于智慧路灯杆的智慧交通应用示例

智慧路灯杆的身影已经越来越频繁出现在我们的生活之中,无论是我们开车在路上,还是行走在商业街,造型美轮美奂,功能丰富多样的智慧路灯杆,也已经成为了一道独特靓丽的街景。 智慧路灯杆如何发挥其智慧功能?对…

Zabbix6.0监控

文章目录 一、Zabbix简介1)zabbix 是什么?2)zabbix 监控原理3)Zabbix 6.0 新特性1、Zabbix server高可用防止硬件故障或计划维护期的停机2、Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernetes系统从多个维度采集…

The ‘kotlin-android-extensions‘ Gradle plugin is no longer supported.

Android使用kotlin开发,运行报错 The kotlin-android-extensions Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.an…

一文了解 Android Auto 车载开发~

作者:牛蛙点点申请出战 背景 我的的产品作为一个海外音乐播放器,在车载场景听歌是一个很普遍的需求。在用户反馈中,也有很多用户提到希望能在车上播放音乐。同时车载音乐也可以作为提升用户消费时长一个抓手。 出海产品,主要服务…

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led,用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

Linux中singal信号的作用

void&#xff08;* signal&#xff08;int sig&#xff0c;void&#xff08;* func&#xff09;&#xff08;int&#xff09;&#xff09;&#xff09;&#xff08;int&#xff09;;设置处理信号的功能 头文件为&#xff1a;#include <signal.h> 指定使用sig指定的信号…

时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测

时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-GRU贝叶斯优化门控循环单元时间序列预测。基于贝叶斯(bayes)…

Spring MVC

hi,今天为大家带来Spring MVC相关知识 文章目录 &#x1f33b;1.什么是Spring MVC?&#x1f36c;1.1什么是MVC?&#x1f36c;1.2MVC和Spring MVC的关系 &#x1f33b;2.Spring MVC的意义&#x1f36c;2.1Spring MVC和Spring Boot区别 &#x1f33b;3.Spring MVC的三大要点&a…

用PointNet分类3D点云

在本教程中&#xff0c;我们将学习如何训练PointNet进行分类。 我们将主要关注数据和训练过程&#xff1b; 展示如何从头开始编码 Point Net 的教程位于此处。 本教程的代码位于这个Github库中&#xff0c;我们将使用的笔记本位于这个Github库中。 一些代码的灵感来自于这个Git…