JVM与GC原理

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 程序的性能和稳定性。

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

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

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

相关文章

测试过程和测试生命周期

软件测试过程是一系列有计划、有组织的活动,旨在识别和解决软件产品中的问题。这个过程通常包括多个阶段,每个阶段都有其特定的目标和方法。 需求分析: 分析软件需求和测试需求,确定测试的目标和范围。理解用户需求和业务目标&…

给现有rabbitmq集群添加rabbitmq节点

现有的:10.2.59.216 rabbit-node1 10.2.59.217 rabbit-node2 新增 10.2.59.199 rabbit-node3 1、分别到官网下载erlang、rabbitmq安装包,我得版本跟现有集群保持一致。 erlang安装包:otp_src_22.0.tar.gz rabbitmq安装包&#xff1…

C++实现一个自定义字符串类(string)

本博客将详细介绍如何在C中实现一个自定义的字符串类 string,这个类模仿了标准库中 std::string 的关键功能。这个过程将涵盖从声明到定义的每一步,重点介绍内存管理、操作符重载以及提供一些关键的实现细节。 首先:我们采用函数的声明与定义…

ArcGIS Pro 3D建模简明教程

在本文中,我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互(即使是专门用于 3D 建模的软件),并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段:…

【SGDR】《SGDR:Stochastic Gradient Descent with Warm Restarts》

arXiv-2016 code: https://github.com/loshchil/SGDR/blob/master/SGDR_WRNs.py 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metric5.2 Single-Model Results5.3 Ensemble Results5.4 Experiment…

kali工具----枚举工具

一、枚举工具 枚举是一类程序,它允许用户从一个网络中收集某一类的所有相关信息。本节将介绍DNS枚举和SNMP枚举技术。DNS枚举可以收集本地所有DNS服务和相关条目。DNS枚举可以帮助用户收集目标组织的关键信息,如用户名、计算机名和IP地址等,…

HarmonyOS实战开发-视频播放、如何实现了视频播放、暂停、调节倍速、切换视频的功能。

介绍 视频播放的主要工作是将视频数据转码并输出到设备进行播放,同时管理播放任务。本文将对视频播放全流程、视频切换、视频循环播放等场景开发进行介绍说明。 本示例主要展示了播放本地视频和网络视频相关功能,使用 ohos.multimedia.media,ohos.resourceManager,…

Python 全栈系列239 使用消息队列完成分布式任务

说明 在Python - 深度学习系列32 - glm2接口部署实践提到,通过部署本地化大模型来完成特定的任务。 由于大模型的部署依赖显卡,且常规量级的任务需要大量的worker支持,从成本考虑,租用算力机是比较经济的。由于任务是属于超高计…

【opencv】示例-inpaint.cpp 图像修复是通过填充损坏图像部分从而修复这些损坏的过程...

原始图像 这段代码展示了一个使用OpenCV库进行图像修复的例子。它首先包含了处理图像编码、解码、显示、处理和照片处理所必要的OpenCV模块的头文件。然后利用cv和std命名空间下的类和方法。通过定义一个鼠标回调函数onMouse来处理图像上的绘图操作,并通过主函数mai…

React添加到现有项目

1.检查现有项目的根目录下是否有package.json文件 如果没有,则在项目的根目录下初始化一个package.json配置文件 2.在根目录下安装react和react-dom依赖 npm install --save react react-dom react-scripts安装成功后,react、react-dom以及react-scr…

汽车制造业PMC组态应用最佳实践

01案例及行业介绍 汽车制造工业是我国国民经济的重要支柱产业,汽车制造工厂一般包含冲压、焊装、涂装、总装四大车间。每辆汽车的生产过程被分解成很多加工任务下发给各个车间进行完成。车辆从冲压车间开始到总装车间结束一直进行不同类型的工序加工。 PMC即生产控…

Sarson Funds 在 Casper 测试网推出稳定币 csprUSD

Sarson Funds 与 Casper Association 合作,在 Casper Network (CSPR)测试网上推出了 csprUSD 稳定币。 作为最新的法币背书型稳定币,csprUSD 进入了数字货币市场,与 Ripple 和 Cardano 等组织近期推出的产品定位一致。…

使用vite从头搭建一个vue3项目(二)创建目录文件夹以及添加vue-router

目录 一、创建 vue3 项目 vite-vue3-project-js二、创建项目目录三、创建Home、About组件以及 vue-router 配置路由四、修改完成后页面 一、创建 vue3 项目 vite-vue3-project-js 使用 vite 创建一个极简 vue3 项目请参考此文章:使用Vite创建一个vue3项目 下面是我…

基于GitHub的开源讨论系统,赋予网站交互可能

Giscus:让每一条见解直达GitHub,用Giscus开启网站与社区的无缝对话新纪元!- 精选真开源,释放新价值。 概览 纯静态网站或博客,由于没有数据存储功能,经常借助第三方的评论系统以插件的方式集成进来&#x…

Java 自定義 List<T> 分頁工具

Java 自定義 List 分頁工具 PS: T可修改为对应的实体 rt com.google.common.collect.Lists;import java.util.Arrays; import java.util.Collections; import java.util.List;/*** ClassName: MyPageHelper* Descripution: List<T>分頁工具**/ public class MyPageHelp…

elementUI 下拉框加提示文案

效果如下&#xff1a; 展示文案在最下面&#xff0c;跟选项有个分割线 <el-select v-model"value" placeholder"请选择" clearable popper-class"addNotice" class"addNoticeS" visible-change"(v) >selectNotice(v,展示…

使用clickhouse-backup备份和恢复数据

作者&#xff1a;俊达 介绍 clickhouse-backup是altinity提供的一个clickhouse数据库备份和恢复的工具&#xff0c;开源项目地址&#xff1a;https://github.com/Altinity/clickhouse-backup 功能上能满足日常数据库备份恢复的需求&#xff1a; 支持单表/全库备份支持备份上…

Day23_学点儿IDEA_单元测试@Test在新module项目中失效、Jackson核心对象 ObjectMapper识别不到

版本 IntelliJ IDEA 2023.2.4 目录结构 Study(Project) ├──JavaSE(Module) │ └──xxxx └──JavaWeb(Module)└──xxxx问题 1.1 在JavaSE项目中正常可以用的单元测试Test&#xff0c;到了JavaWeb项目中不起作用了 1.2 解决方法 如果是新创建的项目&#xff0c;先…

时间序列分析 # 平稳性检验和ARMA模型的识别与定阶 #R语言

掌握单位根检验的原理并能解读结果&#xff1b;掌握利用序列的自相关图和偏自相关图识别模型并进行初步定阶。 原始数据在文末&#xff01;&#xff01;&#xff01; 练习1、根据某1971年9月-1993年6月澳大利亚季度常住人口变动&#xff08;单位&#xff1a;千人&#xff09;的…

Arthas排查工具

简介 | arthas (aliyun.com) 在线安装 #下载jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar#启动会先检测虚拟机进程&#xff0c;如果没有启动失败(idea) java -jar arthas-boot.jar linux安装与window一样 卸载arthas rm -rf ~/.arthas/ rm -rf ~/logs/arthas