【Java】快速入门JVM

news2024/11/25 16:32:21

文章目录

  • 1. JVM简介
  • 2. 类加载简介
  • 3. 类加载的过程
  • 4. 双亲委派
  • 5. GC垃圾回收
  • 6. JVM的回收方式
  • 7. 分代回收

在这里插入图片描述

1. JVM简介

JVM(Java虚拟机)是一个名字为Java的进程,是用于执行Java程序的虚拟机。

JVM会从操作系统中申请一大块内存空间,又把这个内存空间划分成为几个小的区域

区域的划分:

  1. 方法区
  2. 栈(Java虚拟栈和本地方法栈)
  3. 程序计数器
  4. 运行时常量池

代码中的局部变量是放在栈上的,成员变量放在堆上,静态变量放在方法区中,程序计数器放的是下一个要执行的指令地址

一个JVM进行中,堆和方法区只有一份,单栈和程序计数器,每个线程都有自己的一份

补充: 方法区的概念是jdk1.8之前的叫法,而jdk1.8之后没有方法区了,而多了个元数据区.

方法区是JVM申请内存中划分出的一个区域,而元数据区时是用的本地内存

2. 类加载简介

类加载是JVM将类的字节码加载到内存中,并进行验证、准备和解析的过程。也就是源代码(.java)文件编译成字节码文件(.class)

3. 类加载的过程

类加载的过程大致分为以下几步:

  1. 加载
  2. 加载
    • 验证
    • 准备
    • 解析
  3. 初始化

加载:加载是将类的字节码文件加载到内存中的过程。

验证:验证是确保类的字节码符合Java虚拟机规范的过程。

准备: 给类中的静态变量分配内存空间

解析: 初始化字符串常量,把符号引用(占位符)替换成直接引用(内存地址)

初始化:初始化是执行类的初始化代码的过程。

什么时候进行类加载呢?

使用到一个类的时候,就触发类加载(类不一定是程序已启动就加载了,第一次使用时才加载),有点类似于"懒汉模式"

4. 双亲委派

双亲委派是Java类加载器的一种机制,用于保证类的加载安全和避免重复加载。

在讲双亲委派之前,先来了解类加载器

Java类加载器主要有以下几种类型:

  1. 启动类加载器(Bootstrap Class Loader):它是JVM的内置类加载器,负责加载Java标准库中的类
  2. 扩展类加载器(Extension Class Loader):它是Java平台提供的标准类加载器之一,用于加载Java扩展库(如javax包中的类)和Java虚拟机的扩展部分。
  3. 应用程序类加载器(Application Class Loader):也称为系统类加载器(System Class Loader),它是加载应用程序类的默认加载器。应用程序类加载器加载应用程序类路径上的类,即开发人员编写的类和第三方类库。

上述三个类加载器存在父子关系,启动类加载器是扩展类加载器的父类,扩展类加载器是应用程序类加载器的父类

进入类加载的时候,输入的内容是全限定类名,加载的时候从Application Class Loder开始. 即当一个类加载器收到加载类的请求时,它会先委派给父类加载器,只有在父加载器找不到该类的情况下,才会自己加载。如果一直找到最下面的"Application Class Loder"也没有找到,就会抛出一个"类没找到"这样的异常

按照这个顺序的加载最大的好处就是如果子定义的类和Java标准库的类冲突了,此时仍然保留类加载可以加载到标准库中的类

5. GC垃圾回收

GC垃圾回收是Java虚拟机(JVM)自动管理内存的过程。它通过自动识别和回收不再使用的对象,释放内存资源,并提供了内存管理的机制,使开发人员无需手动进行内存释放。

在学习C语言时,有个关键字叫 malloc(动态内存申请),它的内存释放时机是不确定的,需要使用的free进行释放.如果不进行free,这个内存就会一直持续到程序结束. 如果忘记释放,就可能会造成"内存泄漏"

而在Java中,当对象不再被引用时,它们变成了垃圾。垃圾回收器负责扫描程序的内存,找出这些不再被引用的对象,并将它们的内存空间回收,以便后续的对象可以使用。

GC垃圾回收机制基本上可以把内存泄漏问题解决的差不多,但GC也并不是完美的,GC有个STW(stop the world)问题

STW指的是垃圾回收过程中,应用程序的执行被暂停停止的情况。在STW期间,所有的应用线程都会被挂起,直到垃圾回收完成。

STW问题可能会对应用程序的性能和响应时间产生影响,特别是在大型内存或高并发场景下。应用程序的执行会被中断,可能导致暂停时间较长,从而影响系统的实时性和用户体验。

GC垃圾回收主要会受到是哪些内容呢? 答案是,且GC中回收内存,不是以"字节"为单位进行回收的,而是以"对象"为单位回收.

GC怎么判断某个对象是否是垃圾呢?

假设有一个对象,如果已经没有任何引用能够指向它了,说明对象自然就无法再被使用了

两种典型的判定对象是否存在引用的方法:

  1. 引用计数(不是JVM采取的办法)
    • 引用计数的优点: 简单,容易实现,执行效率比较高
    • 引用计数的却嗲: 空间利用率低,可能会出现循环引用的情况
  2. 可达性分析(JVM采取的办法)

在Java中,GC通过根对象作为起点,查找所有与根对象直接或间接相连的对象,这些对象被称为可达对象,它们是程序中仍然被引用的对象。与根对象没有引用链相连的对象被认为是不可达的,它们将被垃圾回收器标记为可回收的对象。

6. JVM的回收方式

共有以下几种方式:

  1. 标记清除: 标记-清除是最基本的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器标记所有可达的对象,将其标记为存活对象。在清除阶段,垃圾回收器清除未被标记的对象,释放它们占用的内存空间。
  2. 复制算法:将内存分为两个区域,一次只使用其中一个区域。在对象存活后,将其复制到未使用的区域中,然后清除旧区域中的所有对象。复制算法适用于对象存活率较低的场景,因为需要较大的内存空间来进行复制。
  3. 标记整理: 标记-整理算法结合了标记-清除和复制算法的特点。它首先标记所有可达对象,然后将存活对象向一端移动,并清除未移动的内存空间。标记-整理算法适用于对象存活率较高的场景。

7. 分代回收

上述三种方式,虽然都可以实现GC回收,但都会存在一些问题. 因此在使用时,就需要根据不同的场景,采取不同的策略.
所以有引入的一个新的垃圾回收机制-“分代回收”

分代回收:分代算法是基于对象生命周期的假设,将内存分为不同的代,一般分为新生代和老年代。新生代中的对象生命周期短暂,采用复制算法进行回收;而老年代中的对象生命周期较长,采用标记-清除或标记-整理算法进行回收。分代算法适用于大部分应用程序,因为对象的生命周期通常是不同的。

新生代的对象被GC扫描的概率低,老年代的对象被GC的扫描率低. 新生代只有熬过多次GC的扫描,没有被回收,才会进入老年代
注: 如果对象是一个特别大的对象,会直接进入老年代

文章到这就结束了,感谢您的观看!
在这里插入图片描述

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

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

相关文章

我的会议(我的审批,会议签字附源码)

目录 前言: 3.我的审批: 3.1实现的特色功能: 3.2显示的效果 3.3思路: 3.4寻找相关的案例或者自己使用JavaScript去写一个类似的功能 3.5具体的步骤: 3.5.1添加静态的jsp代码(我的审批数据的显示&…

投稿注意!APA格式超全示例详解,原本28天能录用,可能要拖延2个月

为什么同一本期刊有论文28天录用,有论文10个月才录用?结合近期征稿的这本经管类SSCI期刊,小编(Unionpub学术)整理了部分影响录用的几个因素,准备提交此期刊的作者可自查参考下: (参…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块, 文件路径拼接,目录操作

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12…

Segment Anything Model (SAM)

论文地址:https://arxiv.org/pdf/2304.02643.pdf 项目地址:Segment Anything | Meta AI (segment-anything.com) SAM贡献: 1.SA任务:提出了提示图像分割任务,在给定任何图像分割提示的情况下返回一个有效的分割掩码…

JS/node:Blob、ArrayBuffer和Buffer

前端较少涉及对二进制数据的处理,但即便如此,我们偶尔总能在角落里看见它们的身影,今天我们就来聊一聊JS的二进制家族:Blob、ArrayBuffer和Buffer(Buffer由Node.js提供) 概述 Blob: 前端的一个专门用于支…

el-checkbox设置溢出...隐藏后,选框和文字垂直方向不居中了

解决方式设置vertical-align:middle样式属性 ::v-deep .el-checkbox__label {font-size: 18px;margin-bottom: 5px;width: 100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;vertical-align: middle;//可以实现复选框和文字垂直方向居中}

2023.8.1号论文阅读

文章目录 MCPA: Multi-scale Cross Perceptron Attention Network for 2D Medical Image Segmentation摘要本文方法实验结果 SwinMM: Masked Multi-view with SwinTransformers for 3D Medical Image Segmentation摘要本文方法实验结果 MCPA: Multi-scale Cross Perceptron Att…

Redis 高可用:主从复制、哨兵模式、集群模式

文章目录 一、redis高可用性概述二、主从复制2.1 主从复制2.2 数据同步的方式2.2.1 全量数据同步2.2.2 增量数据同步 2.3 实现原理2.3.1 服务器 RUN ID2.3.2 复制偏移量 offset2.3.3 环形缓冲区 三、哨兵模式3.1 原理3.2 配置3.3 流程3.4 使用3.5 缺点 四、cluster集群4.1 原理…

芯片制造详解.薄膜沉积.学习笔记(六)

这里附上原视频链接,此文章是对于视频的归纳和整理。 如何造出芯片:薄膜沉积|芯片制造详解06 芯片制造详解.薄膜沉积.学习笔记 六 一、由薄膜引出沉积二、沉积的分类2.1 物理沉积(PVD)2.2 化学气相沉积(CVD) 三、沉积的历史3.1 V1.0 常压化学…

无涯教程-Lua - 简介

Lua是一种轻量语言,它的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快。它用ANSI C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。和许多“大而全”的语言不一样,网络通信…

STM32基础知识学习笔记汇总

笔记后面补充汇集到此 怎么选 初学:海创、杨桃杜洋、江科大、千峰进阶:安福莱、普中过度:韦东山深入:正点、野火其他:金沙滩、自化协、硬石 扩展 库函数操作相当于C,面向对象寄存器操作相当于C &#xff…

【HarmonyOS】键盘遮挡输入框时,实现输入框显示在键盘上方

【关键字】 harmonyOS、键盘遮挡input,键盘高度监听 【写在前面】 在使用API6、API7开发HarmonyOS应用时,常出现页面中需要输入input,但是若input位置在页面下方,在input获取焦点的时候,会出现软键盘挡住input情况&a…

【备战csp-j】 csp常考题型详解(2)

二.计算机网络。 1. TCP/IP 协议共有( )层协议 。 A.3 B.4 C.5 D.6 答案:B 解析: 2.Ipv4 地址是由( ) 位二进制数码表示的。 A.16 B.32 C.24 D.8 答案:B 解析:IP地址是IP协议提供的一种统一的地址格式。在目前使用的IPv…

使用Python创建快速创建剪映草稿轨道,自动生成视频

使用Python创建快速创建剪映草稿轨道,自动生成视频 一、实现原理 实现原理 : JianYingPro 项目文件是 json 的形式存储的,只需要创建draft_content.json,draft_mate_info.json 打开软件后会自动补全。 作用:快速生成草稿,可以完…

jenkins通过sshPut传输文件的时候,报错Permission denied的SftpException

一、背景 使用jenkins的ssh插件传输文件至远程机器的指定目录,php程序打包后,经过zip压缩为oms.zip zip -rq oms.zip ./ -x .git/* -x .env然后我们求md5值 md5sum oms.zip最后执行传输。 09:03:02 Executing command on ssh[116.61.10.149]: mkdir…

深度技术解析:验证码短信API的实现原理与优化策略

引言 验证码短信在现代应用中扮演着至关重要的角色,它是一种简单而高效的安全验证方式,被广泛用于各类应用和场景。验证码短信在现代应用中的起着账号安全保障、交易与支付安全保障等重要作用。 在本文中,本文将围绕验证码短信 API 的基本原…

消息队列中间件 MetaQ/RocketMQ

简介—— 消息队列中间件 MetaQ/RocketMQ 中间件 MetaQ 是一种基于队列模型的消息中间件,MetaQ 据说最早是受 Kafka 的影响开发的,第一版的名字 "metamorphosis",是奥地利作家卡夫卡的名作——《变形记》。RocketMQ 是 MetaQ 的开…

【零基础??天速成 Java】Day1 - 初识 java

目录 前言 1. 第一个 java 程序 2. java 开发的注意事项 3. java 的注释 4. javadoc 标签 5. java 的变量 6. java 的 String 和 基本类型转换 7. java 的输入 8. java 的数组 9. java 的方法 10. java 方法的传参 写在最后: 前言 我的 java 基础学习…

工业机器人:现代制造业的革命力量

随着科技的迅猛发展,工业机器人已经成为现代制造业中不可或缺的一环。工业机器人的发展历经几十年的演进,从最早只能完成重复性、单一性的任务,到如今可以完成复杂多变的工序。工业机器人的应用领域也不断扩大,如汽车制造、电子制…

《零基础入门学习Python》第074讲:GUI的终极选择:Tkinter11

今天我们来讲讲 事件绑定。正如我们此前所提到的,一个 tkinter 的应用程序大部分时间是花费在事件循环中的,也就是通过 mainloop() 方法进入时间循环了,事件可以有各种各样的来源,比如说 用户移动、点击一下鼠标,会产生…