08_其他因素

对象终止、软引用、弱引用、虚引用

应用程序有时会使用 finalization 和弱引用、软引用或虚引用与垃圾收集进行交互。

然而,不鼓励使用 finalization。它可能会导致安全、性能和可靠性问题。例如,依赖 finalization 来关闭文件描述符会使外部资源(描述符)依赖于垃圾收集的及时性,这可能会带来问题。

从JDK 9开始,finalization已经被废弃。而且据JEP 421:Deprecate Finalization for Removal规划,在JDK 18中将会被删除。

对象终止-Finalization

一个类可以声明一个 finalizer - 方法 protected void finalize() - 其方法体释放任何潜在资源。当对象不可达时,GC会安排不可达对象的 finalizer,在GC回收对象内存之前调用它。

当从GC根到对象没有路径时,对象变得不可达,因此有资格进行垃圾收集。GC根包括来自活动线程和内部JVM引用的引用;它们是保持对象在内存中的引用。

对象终止方法迁移

可以使用下面两种技术替代

The try-with-Resources Statement

Try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序结束后必须关闭的对象。Try-with-resources 语句确保在代码块结束时关闭每个资源,即使出现一个或多个异常。

The Cleaner API

如果您预见到应用程序中某个资源的生命周期将超出try-with-resources语句的范围,那么可以使用Cleaner API。Cleaner API 允许程序为对象注册一个清理操作,该操作在对象变得不可达后的一段时间内运行。

与 finalizer 相比,Cleaner 具有以下优点:

  • 更安全:必须显式注册清理程序,并且清理操作无法访问对象本身,因此无法实现对象复活。
  • 性能更好:您可以更多地控制何时注册清理操作,这意味着清理操作永远不会处理未初始化或部分初始化的对象。您还可以取消对象的清理操作。
  • 更可靠:可以控制哪些线程运行清理操作。

但是与 finalizer 一样,垃圾收集器安排了清理操作,因此它们可能会遭受无限延迟。因此,在需要及时释放资源的情况下,请不要在那些情况下使用 Cleaner API。

以下是一个简单的 Cleaner 示例。它执行以下操作:

  • 定义了一个清理操作类 State,该类初始化了清理操作并定义了自身的清理动作(通过重写 State::run() 方法)。
  • 创建了 Cleaner 的实例。
  • 使用 Cleaner 实例,为 myObject1 对象注册了一个 cleaning action(State 的一个实例)。
  • 为确保垃圾收集器安排了 Cleaner 和执行了 cleaning action State::run(),示例中进行如下操作:
  • 将 myObject1 设置为 null 以确保其成为虚不可达对象。
  • 循环调用 System.gc() 来触发垃圾回收进行清理。

图10-1 cleaner api 示例

import java.lang.ref.Cleaner;

public class CleanerExample {
    
    // This Cleaner is shared by all CleanerExample instances
    private static final Cleaner CLEANER = Cleaner.create();
    private final State state;

    public CleanerExample(String id) {
        state = new State(id);
        CLEANER.register(this, state);
    }

    // Cleaning action class for CleanerExample
    private static class State implements Runnable {
        final private String id;

        private State(String id) {
            this.id = id;
            System.out.println("Created cleaning action for " + this.id);
        }

        @Override
        public void run() {
            System.out.println("Cleaner garbage collected " + this.id);
        }
    }

    public static void main(String[] args) {
        CleanerExample myObject1 = new CleanerExample("myObject1");

        // Make myObject1 unreachable
        myObject1 = null;

        System.out.println("-- Give the GC a chance to schedule the Cleaner --");
        for (int i = 0; i < 100; i++) {
            
            // Calling System.gc() in a loop is usually sufficient to trigger
            // cleanup in a small program like this.
            System.gc();
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {}
        }
        System.out.println("-- Finished --");
    }
}

输出

Created cleaning action for myObject1
-- Give the GC a chance to schedule the Cleaner --
Cleaner garbage collected myObject1
-- Finished --

如果您要在生产环境中实现 Cleaner,请考虑以下事项:

  • 清理操作类(本示例中的 State)应作为私有实现细节。特别是,不应该从 main(String[]) 方法中使用它。因此,在实际可行的情况下,您的清理操作类应该是不可变的。一个新对象应该在其构造函数内处理创建自己的清理操作类,并将自身注册到 Cleaner 中。
  • 通常,类需要访问清理操作类内部的对象。最简单的方法是让对象保存对清理操作类的引用。
  • Cleaner 实例应该是共享的。在本示例中,所有 CleanerExample 的实例都应共享一个静态 Cleaner 实例。

引用-对象类型

有三种引用对象类型:SoftReference、WeakReference 和 PhantomReference。每种引用对象类型对应不同级别的可达性。以下是从最强到最弱的不同可达性级别,反映了对象的生命周期:

  • 如果某个线程可以在不遍历任何引用对象的情况下访问对象,则该对象是强可达的。新创建的对象由创建它的线程强可达。
  • 如果对象不是强可达,但可以通过遍历软引用来访问,则称为软可达。
  • 如果一个对象既不是强可达也不是软可达,但可以通过遍历弱引用来访问,则称为弱可达。当指向弱可达对象的弱引用被清除时,该对象就有资格进行最终化处理。
  • 如果一个对象既不是强可达、软可达、也不是弱可达,并且已经被最终化,某些虚引用指向它,则称为虚可达。
  • 如果一个对象以前以任何方式都无法被访问到,那么它就变得不可到达,因此有资格进行回收。

每种引用对象类型都封装了对特定对象的单个引用,这称为 referent(被引用物)。引用对象提供了清除 referent 的方法。

以下是引用对象实例的最常见应用:

  • 在允许系统释放内存(例如,可以根据需要重新生成的缓存值)时,保持对一个对象的访问
  • 确定并可能在某个特定可达性级别下采取一些操作(与 ReferenceQueue 类结合使用)

显式垃圾收集

另一种应用程序与垃圾收集进行交互的方式是通过显式调用 System.gc() 来执行完整的垃圾收集。

这可能会在不必要的情况下强制进行大规模的垃圾收集(例如,当进行小规模垃圾收集就足够时),因此通常应避免使用。显式垃圾回收的性能影响可以通过使用标志 -XX:+DisableExplicitGC 来禁用它进行测量,该标志使 VM 忽略对 System.gc() 的调用。

显式垃圾回收最常见的应用之一是使用远程方法调用(RMI)的分布式垃圾回收(DGC)。使用 RMI 的应用程序引用其他虚拟机中的对象。在这些分布式应用程序中,如果不间或地调用本地堆的垃圾回收,就无法对垃圾进行回收,因此 RMI 会定期强制进行完整的垃圾收集。可以通过属性来控制这些收集的频率,以下是一个例子:

java -Dsun.rmi.dgc.client.gcInterval=3600000
    -Dsun.rmi.dgc.server.gcInterval=3600000 ...

这个例子指定了每小时执行一次显式垃圾回收,而不是默认的每分钟一次。然而,这可能也会导致一些对象需要更长的时间才能被回收。如果不希望对 DGC 活动的及时性设置上限,这些属性可以设置为 Long.MAX_VALUE,使得显式收集之间的时间在实际上变为无限。

软引用

在服务器虚拟机中,软引用比客户端虚拟机中的存活时间长。

通过命令行选项 -XX:SoftRefLRUPolicyMSPerMB=<N> 可以控制清除速率,该选项指定每兆字节堆空闲空间中软引用将保持存活的毫秒数(ms) 。默认值为每兆字节1000毫秒,这意味着一个软引用在最后一个强引用对象被回收后,将会在堆空间中的每兆字节空闲空间中存活1秒。这是一个近似值,因为软引用只有在垃圾收集期间才会被清除,并且垃圾收集可能偶发发生。

类元数据

Java类在Java Hotspot VM中具有内部表示,被称为类元数据。

在之前的Java Hotspot VM版本中,类元数据被分配在所谓的永久代中。从JDK 8开始,永久代被移除,类元数据被分配在本机内存中。用于类元数据的本机内存的默认使用量是无限的。可以使用选项 -XX:MaxMetaspaceSize 来设置用于类元数据的本机内存的上限。

Java Hotspot VM明确管理用于元数据的空间。空间从操作系统请求然后分成块。一个类加载器从其块(一个块绑定到特定的类加载器)中为元数据分配空间。当类被卸载时,其块将被回收以供重用或返回给操作系统。元数据使用由 mmap 分配的空间,而非 malloc。

如果启用了 -XX:UseCompressedOops 选项并且使用了 -XX:UseCompressedClassesPointers 选项,则逻辑上会使用两个不同区域的本机内存来存储类元数据。-XX:UseCompressedClassPointers 使用32位偏移量来表示64位进程中的类指针,就像 -XX:UseCompressedOops 用于Java对象引用一样。为这些压缩过的类指针(32位偏移量)分配了一个区域。区域大小可以使用 -XX:CompressedClassSpaceSize 设置,默认为1GB。压缩类指针的空间作为初始化时由 -XX:mmap 分配并根据需要提交。-XX:MaxMetaspaceSize 应用于已提交压缩类空间和其他类元数据空间之和。

当相应的Java类被卸载时,会释放对应的类元数据。由于垃圾回收而导致Java 类卸载,并且可能会因此卸载并释放对应的元数据。当为类元数据提交的空间达到一定水平(高水位标记)时,将触发垃圾回收。在垃圾收集之后,根据从类元数据释放出来的空间量高水位标记可能会升高或降低。高水位标记将被提高以避免过早地再次触发垃圾回收。高水位标记最初设置为命令行选项 -XX:MetaspaceSize 的值,并基于选项 -XX:MaxMetaspaceFreeRatio 和 -XX:MinMetaspaceFreeRatio 进行调整。如果作为已提交空间比总已提交空间百分比更大,则高水位标记将得到降低;如果小于 -XX:MinMetaspaceFreeRatio,则高水位标记将得到提升。

为选项-XX:MetaspaceSize 指定更高值以避免由于太早触发垃圾回收而导致对于应用程序进行了很多处理度去处理所使用开销让程序产生累计较大开销对应关系表记录与传输关系表记录累计过大LED显示屏良好L描述状语资料去v立靶向行业企业公司差异化供给模式取得联合竞争优势产生关联共同研发 Lightspeed Venture最快速启速资金帮助企业赢得数量投资额丛海外方投8万港币共购退智能订单系统款取步俱进落细节公司电商经济模式升净利润润奈555万21万元21亿详情IN 化解激烈竟争共赢市场份额蜘蛛人可见化看"},"body":"英俊国华覅哎我求似懂非懂
如有需要我们可以继续交流

[0,296s][info][gc,heap,exit] Heap
[0,296s][info][gc,heap,exit] garbage-first heap total 514048K, used 0K [0x00000005ca600000, 0x00000005ca8007d8, 0x00000007c0000000)
[0,296s][info][gc,heap,exit] region size 2048K, 1 young (2048K), 0 survivors (0K)
[0,296s][info][gc,heap,exit] Metaspace used 2575K, capacity 4480K, committed 4480K, reserved 1056768K
[0,296s][info][gc,heap,exit] class space used 238K, capacity 384K, committed 384K, reserved 1048576K

在以 Metaspace 开头的那行中,used 表示已用于加载类的空间;capacity 表示当前分配的块中用于元数据的可用空间;committed 表示块中可用空间的数量;reserved 表示为元数据保留的(但不一定已提交)空间量。以 class space 开头的那行包含了压缩类指针元数据对应的相应数值。 

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

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

相关文章

限量背包问题

问题描述 限量背包问题&#xff1a;从m个物品中挑选出最多v个物品放入容量为n的背包。 问题分析 限量背包问题&#xff0c;可以用来解决许多问题&#xff0c;例如要求从n个物品中挑选出最多v个物品放入容量为m的背包使得背包最后的价值最大&#xff0c;或者总共有多少种放法…

我独自升级:崛起怎么下载 我独自升级游戏下载教程分享

定于5月8日全球揭幕的《我独自升级崛起》——一款扣人心弦的动作RPG巨制&#xff0c;灵感采撷于同名动画及网络漫画的热潮&#xff0c;誓将引领满怀热忱的玩家步入一场交织着深邃探索和宏大规模的奇妙冒险。该游戏立足于一个独树一帜的网络武侠宇宙&#xff0c;细腻刻画了一个凡…

VSCode通过SSH连接虚拟机Ubuntu失败

问题说明 最近使用VSCode通过SSH连接Ubuntu&#xff0c;通过VSCode访问Ubuntu进行项目开发&#xff0c;发现连接失败 在VSCode中进行SSH配置 这些都没有问题&#xff0c;但在进行连接时候出现了问题&#xff0c;如下&#xff1a; 出现了下面这个弹窗 解决方法 发现当…

软件测试职责

软件测试职责主要包括以下几个方面&#xff1a; 1. 需求分析&#xff1a;理解软件需求规格说明书&#xff0c;确保测试活动覆盖所有的功能需求和非功能需求&#xff08;如性能、安全性、兼容性等&#xff09;。 2. 测试计划制定&#xff1a;根据项目需求&#xff0c;设计测试…

NodeJS 如何在npm运行时设置Windows控制台的标题?

通过代码设置 const server app.listen(port, () > {console.log(主机名称&#xff1a;, global.hostname)console.log(主机IP地址&#xff1a;, global.host)console.log(后台服务端口号&#xff1a;, port)console.log(恭喜你&#xff0c;启动成功!)process.title node …

图像处理

图像处理 导入图片 导入io模块&#xff0c;读取文件所在位置&#xff0c;将生成的图像数据赋给变量img&#xff0c;显示图像 from skimage import ioimgio.imread(D:\工坊\图像处理\十个勤天2.png)io.imshow(img) 运行结果&#xff1a; 将图片进行灰度处理 from skimage i…

Autodesk AutoCAD 2025 for Mac:强大的二维三维绘图工具

Autodesk AutoCAD 2025 for Mac是一款专为Mac用户打造的计算机辅助设计软件&#xff0c;它在继承了AutoCAD系列软件的优秀传统的基础上&#xff0c;针对Mac系统进行了全面优化&#xff0c;为用户提供了更出色的绘图和设计体验。 这款软件不仅支持用户创建和编辑复杂的二维几何图…

Nvidia发布Llama3-ChatQA-1.5: 提升对话问答和表格推理能力,平均性能超越GPT-4

前言 近日&#xff0c;Nvidia推出了一款名为Llama3-ChatQA-1.5的对话问答模型。该模型在对话式问答和检索增强型生成等能力方面表现出色&#xff0c;在综合评测指标上甚至超越了当前业界顶尖的GPT-4模型。 技术特点 Llama3-ChatQA-1.5是基于Llama-3基础模型训练而成的。相比之…

01-基本概念

1. 到底什么是数据结构&#xff1f; 数据结构是指在计算机中组织和存储数据的方式&#xff0c;它涉及到数据元素之间的关系以及对这些关系进行操作的方法。数据结构可以看作是一种将数据组织起来以便有效使用的方式&#xff0c;它关注数据的组织、存储和操作&#xff0c;以及如…

关于冯诺依曼体系结构 和 操作系统(Operator System)的概念讲解(冯诺依曼体系结构,操作系统的作用等)

目录 一、冯诺依曼体系结构 二、操作系统 1. 概念 2. 设计操作系统的目的 3.系统调用和库函数概念 4.总结 三、完结撒❀ 一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截…

标贝数据采集标注在自动驾驶场景中落地应用实例

AI数据服务作为人工智能和机器学习的基础&#xff0c;在自动驾驶领域中有着重要地位。与其他人工智能应用场景相比&#xff0c;自动驾驶的落地场景相对复杂&#xff0c;想要让汽车本身的算法做到处理更多、更复杂的场景&#xff0c;就需要运用大量场景化高质量AI数据做支撑。标…

第八节课《大模型微调数据构造》

大模型微调数据构造&#xff08;补充课程&#xff09;_哔哩哔哩_bilibili Tutorial/FineTune at main Focusshang/Tutorial GitHub 一、大模型训练数据介绍 预训练&#xff1a; 网络、论文数据&#xff0c;无标签数据transform算法base model典型&#xff1a;GPT监督微调 对…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

ISIS的基本概念

1.ISIS概述 IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c; 例如运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建立邻接关系&#xff0c;并交互链路状态信息。 CLNS由以下三个部分组成&#xff1a; CLNP&#xf…

新的项目springboot

buybuyshenglombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 添加依赖 lombok package com.example.demo.pojo;import lombok.AllArgsConstructor; import lombok.Data; import …

LLM应用:prompt提示让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽&#xff0c;小伙伴你好&#xff0c;我是 嘟老板。最近接了一个成本千万级的前端项目运维工作&#xff0c;本着 知己知彼 的态度&#xff0c;我将整个前端的大致设计思路过了一遍。不看不知道&#xff0c;一看…吓一跳。光是 路由权限 这块儿的设计&#xff0c;都让我…

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…

Celery + redis 异步分布式任务队列安装测试

Celery 异步分布式任务队列 Celery 5.4.0 官方文档 环境&#xff1a;3台 centos7.9 普通用户 redisSchedulerworkerdp951dp96111dp971 文章目录 Celery 异步分布式任务队列1、Celery 介绍2、安装部署2.1 安装消息中间件&#xff08;broker&#xff09;2.2 安装Celery 3、功能…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…
最新文章