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 instancesprivate 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 CleanerExampleprivate 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);}@Overridepublic void run() {System.out.println("Cleaner garbage collected " + this.id);}}public static void main(String[] args) {CleanerExample myObject1 = new CleanerExample("myObject1");// Make myObject1 unreachablemyObject1 = 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.mzph.cn/bicheng/7148.shtml

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

相关文章

CTF_RE周报(三)

主要是复现XY的题目&#xff0c;嗯&#xff0c;这周刷题也感觉到了一点问题&#xff1a;不能太依赖wp了&#xff0c;但是后面的题目额也确实不看wp都不知道怎么下手有的&#xff0c;还是需要控制好那个度。 一&#xff0c;16位DOS程序 这类题目好像已经不好运行了&#xff0c…

【GameFi】链游 | Seraph | 区块链上的动作角色扮演 NFT 装备收集和掠夺游戏

官网下载 新赛季公告&#xff1a;https://www.seraph.game/#/news/357 开始时间&#xff1a;2024年4月19日 11:00 (UTC8&#xff09; discard会有人发送一些激活码&#xff0c;或者有一些活动&#xff0c;只需要填表格关注账号&#xff0c;参与了就会将激活码发到你的邮箱 …

AI不只是技术,更是一种思维方式

一、AI思维 1.个人&#xff1a;提升自己的综合能力&#xff0c;成为一名懂技术、懂设计、懂硬件、懂市场运营等知识的综合型人才 2.数据&#xff1a;从全局视角看数据流向&#xff0c;挖掘数据价值 3.产品&#xff1a;运用新技术&#xff0c;发掘新需求点&#xff0c;探索产…

在线编辑、预览、基于wps web office,v3版 强势来袭

说明 v1 版本已经不再更新了&#xff0c;官方也只是提供以前申请下来的账号能继续使用&#xff0c;新申请&#xff0c;需要用到v3了v3 版本sdk参考 wps-weboffice-sdk-v3, 里面有很详细的注释v3 集成方法&#xff0c;后端请参考wps-weboffice-v3-demo, 实现你需要对接的接口即…

io (fscanf fprintf)

20 #include <sys/un.h>21 typedef struct stu22 {23 char name[16];24 int age;25 double score;26 }stu;27 int main(int argc, const char *argv[])28 {29 /* 有如下结构体30 31 申请该结构体数组&#xff0c;容量为5&#xff0c;初始化5个学生的信息32 …

奶爸预备 |《伯克毕生发展心理学.从0岁到青少年》 / (美) 劳拉·E. 伯克著——读书笔记

目录 引出第一篇 人的发展理论与研究第1章 历史、理论和研究方法 第二篇 发展的基础第2章 生物基础与环境基础第3章 孕期发育、分娩及新生儿 第三篇 婴儿期和学步期&#xff1a;0~2岁第4章 婴儿期和学步期的身体发育第5章 婴儿期和学步期的认知发展第6章 婴儿期和学步期的情绪与…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null&#xff0c;count为0 Null 不支持加减乘除&#xff0c;大小比较&#xff0c;相等比较&#xff0c;否则只能为空&#xff1b;只能用‘is [not] null’来进行判断&#xff1b; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

ADS基础教程9-理想模型和厂商模型实现及对比

目录 一、概要二、厂商库使用1.新建cell2.调用厂商库中元器件3.元器件替换及参数选择4.完成参数选择5.导入子图 三、仿真实现注意事项 一、概要 本文将介绍在ADS中调用厂商提供的库&#xff0c;来进行原理图仿真&#xff0c;并实现与ADS系统提供的理想元器件之间的比较。 二、…

【C++PCL】点云处理ESF描述符

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 重点:每个模块都有参数如何调试的讲解,即调试某个参数对结果的影响是什么,大家有问题可以评论哈,如果文章有错误的地方,欢迎来指出错误的…

KAN:Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接&#xff1a;https://arxiv.org/abs/2404.19756 代码链接&#xff1a;https://github.com/KindXiaoming/pykan 项目链接&#xff1a;https://kindxiaoming.github.io/pykan/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

【微服务】网关(详细知识以及登录验证)

微服务网关 网关网关路由快速入门路由属性 路由断言网关登录校验自定义过滤器实现登录校验网关传递用户OpenFeign传递用户 网关 网络的关口&#xff0c;负责请求的路由&#xff0c;转发&#xff0c;身份校验 当我们把一个单体项目分成多个微服务并部署在多台服务器中&#xff…

UE5介绍及安装

**虚幻引擎5&#xff08;Unreal Engine 5&#xff0c;简称UE5&#xff09;**是由Epic Games公司开发的一款游戏引擎&#xff0c;它提供了强大的游戏开发功能和工具&#xff0c;帮助游戏开发者更加高效、灵活地创建出高品质的游戏。UE5在虚幻4的基础上进行了大量的升级和改进&am…

MyBatis 使用 XML 文件映射

在MyBatis中 我们可以使用各种注解来配置我们Mapper 类中的方法 我们为什么要使用XML文件呢&#xff1f; 如果我们是一条非常长的SQL 语句 使用 注解配置的话&#xff0c; 会非常不利于阅读 如下 所以&#xff0c;就需要使用到一个XML文件来对SQL语句进行映射&#xff0c;那么 …

Retrofit库中,Call​;Retrofit使用举例;@GET,@PUT区别;

目录 在Retrofit库中,Call​ Retrofit使用举例 Call> listRepos(@Path("user") String user); Call是什么:

234234235

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

OSEK任务管理

1 前言 RTOS通过任务&#xff08;task&#xff09;来组织应用层程序框架&#xff08;framework&#xff09;&#xff0c;支持任务的并发和同步执行&#xff08;concurrent and asynchronous execution of tasks&#xff09;&#xff0c;并通过调度器&#xff08;scheduler&…

【Axure高保真原型】动态伸缩信息架构图

今天和大家分享动态伸缩信息架构图的原型模板&#xff0c;我们可以通过点击加减按钮来展开或收起子内容&#xff0c;具体效果可以点击下方视频观看或者打开预览地址来体验 【原型效果】 【Axure高保真原型】动态伸缩信息架构图 【原型预览含下载地址】 https://axhub.im/ax9/…

项目管理-项目采购管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 本文承接 项目采购管理第二部分&#xff0c;详细讲解项目合同管理。 项目采购管理过程--重点&#xff1a; ①ITTO 输入&#xff0c;输出…

矩池云jupyter运行opengait代码 未完成版

文章目录 前言——矩池云的使用技巧1.切换源 一、下载数据集二、下载模型三、环境配置1.查看python、torch、torchvision版本2.查看一些包版本是否过高3.下载包 四、开始训练1.设置环境变量2.遇到的问题&#xff08;1&#xff09;torch.cuda.is_available()返回false&#xff0…

【信息系统项目管理师知识点速记】资源管理基础

项目团队 执行项目工作,实现项目目标的一组人员。成员具备不同技能,可全职或兼职,随项目进展而变化。参与项目规划和决策,贡献专业技能,增强对项目的责任感。项目管理团队 直接参与项目管理活动的成员,负责项目管理和领导。负责项目各阶段的启动、规划、执行、监督、控制…