49天精通Java,第34天,finalize、引用计数、JVM停止复制、JVM即时编译器

news2024/12/29 11:07:50

在这里插入图片描述

目录

    • 一、finalize
    • 二、引用计数
    • 三、JVM停止复制
    • 四、JVM即时编译器
    • 五、惰性评估

大家好,我是哪吒。

🏆本文收录于,49天精通Java从入门到就业。

全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。

一、finalize

在Java中,finalize()是一个Object类的方法,用于在对象被垃圾收集器回收之前执行一些清理操作。当一个对象成为垃圾时,它的finalize()方法会被自动调用。

finalize()方法的语法格式如下:

protected void finalize() throws Throwable {
    // 清理代码
}

在finalize()方法中可以编写一些清理资源的代码,例如关闭文件、释放内存等。

finalize() 方法只能在对象被垃圾回收之前调用,并且不能抛出异常。如果在垃圾回收之前调用 finalize() 方法,将会导致程序崩溃。因此,在编写 finalize() 方法时,需要考虑对象的生命周期和清理操作的执行顺序。

垃圾回收器的目的是回收程序里不再使用的内存。所以任何与垃圾回收相关的活动,特别是finalize()方法,都与内存的释放息息相关。

通常情况下,我们不能依赖finalize(),而是必须创建爱你单独的清理方法,并显式的调用它们,finalize()只对一些非常罕见的特殊长江的内存清理有用。

需要注意的是,finalize()方法的执行时机是不确定的,并且不能保证一定会被执行。

因此,不应该在finalize()方法中依赖于某些必要的操作,如果有必要进行清理操作,应该使用finally块来确保清理操作一定会被执行。

另外,由于finalize()方法的执行时机和顺序是不确定的,因此通常不建议在程序中过多地依赖它。如果需要在程序运行期间进行清理操作,应该显式地调用相应的清理方法,而不是依赖于finalize()方法。

二、引用计数

每个对象都包含一个引用计数器,并且每次该对象被引用时,引用计数都会增加。每次引用离开作用域或设置为null时,引用计数都会减少。管理引用计数是在程序整个生命周期中都存在的一个小而恒定的开销。垃圾收集器遍历整个对象列表,当它找到引用计数为零的对象时,就会释放该存储空间。

引用计数有一个问题,就是如果对象循环引用彼此,就算变成了垃圾,它们的引用计数可能仍不是零。定位这种自引用的对象组需要垃圾收集器做大量额外工作。

JVM 引用计数的目的是为了避免内存泄漏和死锁等问题。

JVM 引用计数的值是在运行时动态计算的,因此它们可能会随着时间的推移而发生变化。此外,JVM 引用计数的值也可能会被垃圾收集器重新分配,因此它们的值可能会发生变化。

总之,JVM 引用计数是一种用于管理内存的机制,它可以帮助JVM 避免内存泄漏和死锁等问题。

三、JVM停止复制

JVM停止-复制算法是一种用于垃圾回收的算法,在JVM中被称为标记-清除-复制算法。

该算法分为两个阶段:标记和清除。

标记阶段,垃圾回收器遍历所有的引用对象,标记出所有“可达”的对象,即可以被程序访问到并使用的对象。在清除阶段,垃圾回收器会将未被标记的“不可达”对象清除掉,并将所有“可达”对象移动到一个新的内存区域中,以便进行下一次垃圾回收。

移动可达对象时,JVM采用了一种称为复制(Copy)的方式。具体来说,它将堆内存划分为两个大小相等的空间,分别为From Space和To Space。在每次垃圾回收时,JVM会将所有“可达”对象从From Space复制到To Space中,并按照顺序依次排列。然后,将From Space中的所有对象全部清除掉,使其变为空闲内存区域。这样就完成了一轮垃圾回收。

停止-复制算法相对于标记-清除算法来说,它可以有效避免内存碎片问题,并且在清理垃圾时效率更高。但是,它也存在一些缺点,例如需要额外的空间来存储To Space,同时在移动对象时也会增加一定的开销。

四、JVM即时编译器

JVM即时编译器是一种Java虚拟机的编译器,它可以在运行时将Java源代码编译成字节码,从而加速Java应用程序的开发和部署。JVM即时编译器可以提高Java应用程序的性能和响应速度,因为它可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。

JVM即时编译器通常由Java虚拟机提供商提供,并且需要在运行Java应用程序的计算机上安装相应的JVM。JVM即时编译器可以将Java源代码编译成字节码,并将其存储在本地内存中,从而加速Java应用程序的开发和部署。

JVM即时编译器的主要优点包括:

  1. 提高Java应用程序的性能和响应速度:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
  2. 提高Java应用程序的可维护性和可扩展性:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
  3. 提高Java应用程序的安全性:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
  4. 提高Java应用程序的可移植性:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。

总之,JVM即时编译器是一种非常有用的Java编程工具,它可以提高Java应用程序的性能和响应速度,并提高Java应用程序的可维护性和可扩展性。

五、惰性评估

惰性评估的意思是除非必要,否则不会对代码进行即时编译。

永远不执行的代码可能永远不会被即时编译。

惰性评估通常用于优化代码的执行时间和空间复杂度。它在执行之前包含大量表达式,但不会立即评估它们。相反,它只在需要结果时才评估它们。这种方法有助于减少算法的时间复杂度,因为它不需要重复计算,并且可以避免算法在执行之前包含大量表达式。


在这里插入图片描述

🏆本文收录于,49天精通Java从入门到就业。

全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

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

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

相关文章

chatgpt赋能Python-pythonchallenge

Python Challenge: 挑战你的Python技能 如果你正在寻找一种提高Python编程技能的有趣方法,那么Python Challenge是一个不错的选择。Python Challenge是一个在线的puzzle游戏,每个挑战都需要使用Python编写程序来解决。这些挑战是由一个名叫Nadav Samet的…

centos或ubuntu部署OpenSips

参考 Centos7安装opensips超详细教程 centos7 部署opensips信令服务器 【死磕opensips】sip协议解析 开源SIP Kamailio OpenSIPS的四种均衡负载算法详解和SBC呼叫路由 基于SIP协议的性能测试——奇林软件kylinPET OpenSIPS实战(一):OpenSIPS…

【消息中间件】RocketMQ如何保证消息的可靠性?

文章目录 前言一 、发送端消息可靠性1. 同步发送2. 异步发送3. 单向发送4. 发送重试策略 二、存储端消息可靠性1. 存储可靠性挑战2. 同步刷盘3. 异步刷盘(默认)4. 过期文件删除 三、消费端消息可靠性1. 消费重试2. 死信队列3. 消息回溯 四、总结参考与感…

一文读懂“大语言模型”

1、背景 本文基于谷歌云的官方视频:《Introduction to Large Language Models》 ,使用 ChatGPT4 整理而成,希望对大家入门大语言模型有帮助。 本课程主要包括以下 4 方面的内容: 大语言模型的定义描述大语言模型的用例解释提示…

网络安全分组混战靶机攻击与加固——BPlinux系列

网络安全分组混战靶机攻击与加固——BPlinux系列 目录 一、渗透过程 二、加固过程 三、中职网络安全竞赛知识星球 一、渗透过程 #这是一个以前混战阶段用的靶机然后C模块也会用 1、我们先使用nmap --scriptvuln(这是nmap自带的脚本,可以扫描可利用的漏洞&…

计算机网络|第四章:网络层:数据平面

前文回顾:第三章:传输层 运输层依赖于网络层的主机到主机的通信服务,提供各种形式的进程到进程的通信。网络层与传输层和应用层不同的是,在网络中的每一台主机和路由器中都有一个网络层部分。正因如此,网络层协议是协议…

metaRTC+ZLMediaKit实现webrtc的推拉流

概述 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架,是一个支持webrtc SFU的优秀的流媒体服务器系统。 metaRTC新版本支持whip/whep协议,支持whip/whep协议的ZLMediaKit推拉流。 信令通信 ZLMediaKit新版本支持whip和whep协议,支…

065:cesium设置带有箭头的线材质(material-9)

第065个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置带有箭头的线材质,请参考源代码,了解PolylineArrowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共82行)相关API参考…

Microsoft Office 2010安装

哈喽,大家好。今天一起学习的是office2010的安装,有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统:Windows 7 不建议win10及以上操作系统使用 系统类型:64位 演示版本:SW_DVD5_Office_Profession…

Ceres简介及示例(9)On Derivatives(Numeric derivatives)

使用analytic derivatives的另一个极端是使用numeric derivatives。关键是,对函数f(x)关于x的求导过程可以写成极限形式: Forward Differences前向差分 当然,在计算机中,我们不能执行数值求极限操作,所以我们要做的是&#xff0…

squid的基本代理

一、Squid代理服务器的概述 squid 作为一款服务器代理工具,可以缓存网页对象,减少重复请求,从而达到加快网页访问速度,隐藏客户机真实IP,更为安全。 Squid主要提供缓存加速、应用层过滤控制的功能 1、squid代理的工…

攻击者使用“Geacon”Cobalt Strike工具瞄准macOS

威胁行为者现在正在部署一种名为 Geacon 的 Cobalt Strike 的 Go 语言实现,它于四年前首次出现在 GitHub 上。 他们正在使用红队和攻击模拟工具来针对 macOS 系统,其方式与过去几年在 Windows 平台上使用 Cobalt Strike 进行后开发活动的方式大致相同。…

Rust每日一练(Leetday0007) 删除结点、有效括号、合并链表

目录 19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list 🌟🌟 20. 有效的括号 Valid Parentheses 🌟 21. 合并两个有序链表 Mmerge-two-sorted-lists 🌟 🌟 每日一练刷题专栏 🌟 Ru…

web搭建服务器端+创建web后端项目详细步骤

一、搭建服务器端 Web服务器:用于响应来自Web客户端(如浏览器、移动应用程序等)的请求并提供Web页面和其他Web资源的软件程序或计算机系统。它允许用户在Web浏览器中输入网址,通过HTTP协议向服务器发送请求,并收到Web页…

用原生JS实现虚拟列表(IT枫斗者)

用原生JS实现虚拟列表 介绍 最近在开发需求的时候,有用到 Antd 的虚拟列表组件 rc-virtual-list ,粗略地看了一下源码,于是萌生了自己写一个虚拟列表的想法。当一个列表需要渲染大量数据的时候是非常耗时的,而且在列表滚动的过程…

Golang每日一练(leetDay0073) 实现前缀树、最短子数组

目录 208. 实现 Trie (前缀树) Implement-trie-prefix-tree 🌟🌟 209. 长度最小的子数组 Minimum-size-subarray-sum 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每…

多线程的三种创建方式及各自的优缺点分析

第一种方式:继承Thread类,覆写run()方法 1、创建一个MyThread类,继承Thread类; 2、覆写run()方法,在run()方法内编写任务代码; 3、创建MyThread类,需要注意的是,如果想要给线程命名…

传染病学模型 | Matlab实现SI传染病学模型 (SI Epidemic Model)

文章目录 效果一览基本描述模型介绍程序设计参考资料效果一览 基本描述 传染病学模型 | Matlab实现SI传染病学模型 (SI Epidemic Model) 模型介绍 SI传染病模型是一种基于微分方程的流行病学模型,用于模拟传染病在人群中的传播过程。SI模型中,人群被划分为易感者(S)和感染者…

来 Azure 学习 OpenAI 四 - 用 Embedding 赋能 GPT

大家好,我是学生大使 Jambo。在我们前一篇文章中,我们介绍了 OpenAI 模型的调用。今天,我将为大家介绍 Embedding 的使用。 嵌入是什么 嵌入(Embedding )是一种将高维数据映射到低维空间的方法。嵌入可以将高维数据可…

第一章 初识Python

1.1 课前必读 课程大纲 1.2 Python介绍 Python特点: 主流语言;用途广泛,号称万能语言;上手简单; Python用途: 数据挖掘(爬虫)和数据分析自动化脚本编写(软件测试人员使用…