JVM与GC原理

news2024/9/28 9:26:54

JVM运行流程

Java 虚拟机(Java Virtual Machine,JVM)是 Java 平台的核心组件之一,它是一个在实际硬件和操作系统上模拟运行 Java 字节码的虚拟计算机

Java 程序被执行的顺序通常包括以下几个步骤:

  1. 编辑(Edit):程序员编写 Java 源代码文件(.java 文件),其中包含类、方法、变量等定义。

  2. 编译(Compile):使用 Java 编译器(javac)将源代码文件编译成字节码文件(.class 文件)。编译过程将源代码文件转换为平台无关的字节码。

  3. 加载(Load):Java 虚拟机(JVM)加载字节码文件到内存中,并对字节码进行验证、准备和解析等操作。

  4. 链接(Link):在链接阶段,JVM 将字节码文件中的符号引用转换为直接引用,并生成可执行代码。链接包括三个子阶段:

    • 验证(Verification):确保字节码文件符合 Java 虚拟机规范,防止恶意代码和错误代码对系统造成损害。
    • 准备(Preparation):为类的静态变量分配内存空间,并设置默认初始值。
    • 解析(Resolution):将符号引用转换为直接引用,即将类、方法、字段等在内存中的地址解析出来。
  5. 初始化(Initialization):在初始化阶段,JVM 执行类的初始化代码,对静态变量赋初值,并执行静态代码块。初始化阶段是类加载过程中的最后一个阶段,只有在初始化之后,类才能被真正使用。

  6. 执行(Execution):JVM 执行程序的主方法(main() 方法),从 main() 方法开始执行程序的主要逻辑。程序的执行顺序由代码中的逻辑和控制流程决定,可以包括方法调用、条件语句、循环结构等。

以上是 Java 程序执行的一般顺序,每个步骤都是逐步进行的,直到程序完全执行结束。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

GC

垃圾回收(Garbage Collection,GC)是 Java 虚拟机(JVM)自动管理内存的重要功能,它负责在运行时识别和清除不再使用的对象,以释放内存空间。以下是 GC 的核心知识点:

  1. 对象的生命周期:了解对象的生命周期是理解 GC 的基础。当一个对象被创建后,它会被分配在堆内存中。当对象不再被引用时,它变成了不可达对象,这时候就可以被垃圾回收器识别和回收。

  2. 引用类型:在 Java 中,对象之间的引用可以分为强引用、软引用、弱引用和虚引用等几种类型。不同类型的引用影响着对象的生命周期和垃圾回收行为。

  3. 垃圾回收算法:垃圾回收器使用不同的算法来识别和回收内存中的不再使用的对象。常见的算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法等。

  4. 垃圾回收器:Java 虚拟机中有多种垃圾回收器,如串行回收器、并行回收器、并发回收器和 G1 回收器等。不同的回收器适用于不同的场景和需求,可以通过 JVM 参数进行配置和选择。

  5. GC 日志分析:GC 日志记录了垃圾回收器的执行情况,包括回收的对象数量、回收时间、停顿时间等信息。通过分析 GC 日志可以了解程序的内存使用情况和垃圾回收性能,进而优化程序的内存管理和性能。

  6. 调优策略:根据实际场景和需求,需要选择合适的垃圾回收器和调优策略。常见的调优手段包括调整堆大小、选择合适的垃圾回收器、减少对象的创建和引用、优化程序逻辑等。

以上是 GC 的核心知识点,理解这些知识可以帮助开发者更好地理解 Java 内存管理机制,优化程序的性能和内存利用率。

在这里插入图片描述

在这里插入图片描述
在 Java 虚拟机中,堆内存(Heap)被划分为不同的区域,其中包括新生代(Young Generation)、老年代(Old Generation)等。这些区域主要用于管理对象的生命周期和执行垃圾回收。以下是对新生代和老年代的介绍:

  1. 新生代(Young Generation)

    • 新生代是堆内存的一部分,用于存放新创建的对象。
    • 新生代通常被进一步划分为 Eden 区和两个 Survivor 区(From 和 To 区)。
    • 大多数对象首先分配在 Eden 区,当 Eden 区满时,会触发 Minor GC,将存活的对象移动到 Survivor 区。
    • Survivor 区用于存放经过一次或多次 Minor GC 后仍然存活的对象。在多次 Minor GC 过程中,存活的对象会从一个 Survivor 区移动到另一个 Survivor 区,直到最终被移动到老年代或被回收。
  2. 老年代(Old Generation)

    • 老年代用于存放长期存活的对象和从新生代晋升过来的对象。
    • 当一个对象经过多次 Minor GC 后仍然存活,它会被晋升到老年代。
    • 当老年代的空间不足时,会触发 Full GC(Major GC 或 Full Garbage Collection),对整个堆进行垃圾回收。
    • Full GC 的触发频率相对较低,因为它会导致停顿时间较长,影响程序的性能。

新生代和老年代的划分使得 Java 垃圾回收更加高效,因为大部分对象的生命周期较短,很快就会被回收,而只有少部分对象会进入老年代,减少了 Full GC 的频率。优化堆内存的分配和垃圾回收策略,可以提高 Java 程序的性能和稳定性。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Midjourney 中文文档

快速使用 学习如何在Discord上使用Midjourney Bot从简单的文本提示中创建自定义图像。 行为准则 不要表现出不良行为。不要使用我们的工具制作可能引起煽动,不安或引起争议的图像。这包括血腥和成人内容。尊重其他人和团队。 1:加入Discord 访问Midj…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇 日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐(AI写歌)的时候,你是不是有这样的困惑: &…

Docker 部署网页版 vscode (code-server)

什么是 code-server code-server 是一个基于 Visual Studio Code 的开源项目,它允许你通过 Web 浏览器来使用 Visual Studio Code 的编辑功能。这意味着你可以在任何设备上,只要有浏览器和网络连接,就可以访问和使用 Visual Studio Code&…

如果备份了oradata文件,该如何还原Oracle数据呢?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果,再通过grafana采集influxdb数据库数据,完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版: &#xff0…

AI预测体彩排列3第2套算法实战化测试第1弹2024年4月22日第1次测试

从今天开始,开始新一轮的测试,本轮测试,以6码为基础,同步测试杀号情况,争取杀至4-5码。经过计算,假如5码命中,即每期125注,投入250元,十期共计2500元,则命中率…

06 JavaScript学习:语句

JavaScript 语句是用来执行特定任务或操作的一组指令。它可以包括变量声明、条件语句、循环语句、函数调用等。JavaScript 语句以分号结尾,每个语句都会被解释器执行。 分号 ; 在JavaScript中,分号(;)用于表示语句的结束。尽管在…

一款pdf工具

下载链接:点击跳转; 它是一个installer,下好它之后,把网断掉,然后双击它,他会默认安装在C盘,安装时,浏览器可能会有一个弹窗,直接关掉并进入任务管理器杀掉所有smallerp…

漫谈HAMR硬盘的可靠性-1

随着云计算、AI应用、大数据分析等领域对存储需求的持续增长,HAMR技术正逐步引领HDD行业进入新的发展阶段。目前,业内已经有了基于HAMR技术的大容量硬盘,并计划在未来几年内进一步提高至40TB甚至更高容量。 希捷在之前财报中透露,…

C语言结构体,枚举,联合

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 第八章 详解数据在内存中的存储 第九章 C语言指针进阶 文章目录 1. 结构体 1.1 声明结构…

xhEditor实现WORD粘贴图片自动上传

1.下载示例: 从官网下载 http://www.ncmem.com/webapp/wordpaster/versions.aspx 从gitee中下载 https://gitee.com/xproer/wordpaster-php-xheditor1x 2.将插件目录复制到项目中 3.引入插件文件 定义插件图标 初始化插件,在工具栏中添加插件按钮 效果…

面向对象目录总结

【零】思维导图 【一】初识面向对象 Python 初识面向对象-CSDN博客 【二】面向对象-封装 Python 面向对象之封装和装饰器property_面向对象python封装property-CSDN博客 【三】面向对象-继承 Python 面向对象之继承和组合_面向对象 组合 继承-CSDN博客 【四】面向对象-多…

YOLOv9改进策略 | Conv篇 | 利用 Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)

一、本文介绍 本文给大家带来的改进机制是Haar 小波的下采样HWD替换传统下采样(改变YOLO传统的Conv下采样)在小波变换中,Haar小波作为一种基本的小波函数,用于将图像数据分解为多个层次的近似和细节信息,这是一种多分…

6.搭建Eureka

eureka-server自己也是一个微服务&#xff0c;所以eureka-server在启动的时候也会将自己注册到eureka上。eureka集群的时候&#xff0c;会将多个eureka相互注册&#xff0c;这个时候&#xff0c;defaultZone的值会有多个&#xff0c;用逗号隔开。 <?xml version"1.0&…

Mac读写U盘软件哪个好用 Mac读写U盘很慢怎么解决 macbookpro读取u盘

在使用Mac电脑时&#xff0c;读写U盘是一个常见的需求&#xff0c;特别是当U盘格式为NTFS时。选择适合的软件来实现这一操作至关重要。下面我们来看Mac读写U盘软件哪个好用&#xff0c;Mac读写U盘很慢怎么解决的相关内容。 一、Mac读写U盘软件哪个好用 在Mac上选择一款适合的…

程序设计语言—Python几种语言区别的总结

程序设计语言篇—Python&几种语言区别的总结 文章目录 程序设计语言篇—Python&几种语言区别的总结一、Python介绍&理解1.1 Python基础1.2 Python规范 二、标识符&变量&常量三、数据类型&运算符和表达式3.1 数据类型3.2 运算符&表达式 四、常用的函…

HarmonyOS ArkUI实战开发-NAPI数据类型

在前两篇文章里笔者简单介绍了 NAPI 工程结构以及生成的 cpp 源码部分&#xff0c;其中 JS 应用层传递过来的数据被封装在了 napi_value 中&#xff0c;使用前先要转换成对应的 C/C 数据类型&#xff0c;C/C 端的数据也要转换成 napi_value 数据类型传递给 JS 应用层&#xff0…

哈希表实现[很详细!]

目录 哈希表 定义节点类 根据hash码获取value 向hash表存入新key value,如果key重复,则更新value 根据hash码删除,返回删除的value 关于resize()一些问题的解答 冲突测试 MurmurHash 设计思考 练习 Leetcode01 Leetcode03 Leetcode49 Leetcode217 Leetcode136 L…

网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚

文章目录 1. ARQ自动重传协议1.1 停止等待ARQ1.2 连续ARQ1.3 总结 2. TCP的流量控制3. TCP的拥塞控制3.1 慢开始算法3.2 拥塞避免算法3.3 快重传算法3.4 快恢复算法 1. ARQ自动重传协议 自动重传请求&#xff08;Automatic Repeat-reQuest&#xff09;&#xff0c;通过使用确认…

如何在Flask应用程序中使用JSON Web Tokens进行安全认证

密码、信用卡信息、个人识别号码&#xff08;PIN&#xff09;——这些都是用于授权和认证的关键资产。这意味着它们需要受到未经授权的用户的保护。 作为开发者&#xff0c;我们的任务是保护这些敏感信息&#xff0c;并且在我们的应用程序中实施强大的安全措施非常重要。 现在…