key 和secret_Java Secret:加载和卸载静态字段

key 和secret

总览

首先,很自然地假设静态字段具有特殊的生命周期,并且在应用程序的生命周期中一直存在。 您可以假设它们存在于内存中的特殊位置,例如C或类元信息的perm gen中的内存开始。

但是,得知静态字段驻留在堆上,可以具有任意数量的副本并像其他任何对象一样被GC清除,可能会令人惊讶。

这是在先前的讨论之后得出的; 静态块会被解释吗?

加载静电场

当获得用于链接的类时,它可能不会导致静态块被初始化。

一个简单的例子

public class ShortClassLoadingMain {public static void main(String... args) {System.out.println("Start");Class aClass = AClass.class;System.out.println("Loaded");String s= AClass.ID;System.out.println("Initialised");}
}class AClass {static final String ID;static {System.out.println("AClass: Initialising");ID = "ID";}
}

版画

Start
Loaded
AClass: Initialising
Initialised

您可以看到您可以在初始化类之前获得对类的引用,只有在使用该类时,该类的引用才会被初始化。

加载多个静态场

每个加载类的类加载器都有其自己的静态字段副本。 如果在两个不同的类加载器中加载一个类,则这些类可以具有具有不同值的静态字段。

卸载静电场

当类的ClassLoader被卸载时,静态字段将被卸载。 执行GC时将卸载该线程,并且线程堆栈中没有强引用。

将这两个概念放在一起

这是一个示例,其中类在初始化消息时以及在其字段完成时打印消息。

class UtilityClass {static final String ID = Integer.toHexString(System.identityHashCode(UtilityClass.class));private static final Object FINAL = new Object() {@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println(ID + " Finalized.");}};static {System.out.println(ID + " Initialising");}
}

通过重复加载此类,一次两次

for (int i = 0; i < 2; i++) {cl = new CustomClassLoader(url);clazz = cl.loadClass(className);loadClass(clazz);cl = new CustomClassLoader(url);clazz = cl.loadClass(className);loadClass(clazz);triggerGC();
}
triggerGC();

你可以看到这样的输出

1b17a8bd Initialising
2f754ad2 Initialising-- Starting GC
1b17a8bd Finalized.
-- End of GC6ac2a132 Initialising
eb166b5 Initialising-- Starting GC
6ac2a132 Finalized.
2f754ad2 Finalized.
-- End of GC-- Starting GC
eb166b5 Finalized.
-- End of GC

在此日志中,将首先加载该类的两个副本。 对第一类/类加载器的引用被对第二类/类加载器的引用覆盖。 第一个在GC上清理,第二个保留。 在第二个循环中,又初始化了两个副本。 保留第四个,在GC上清理第二个和第三个。 最后,当不再使用静态字段的第四份副本时,将在GC上清除它们。

代码

第一个示例– ShortClassLoadingMain 第二个示例– LoadAndUnloadMain

参考: Java Secret:从Vanilla Java的 JCG合作伙伴 Peter Lawrey 加载和卸载静态字段 。

相关文章:
  • 每个程序员都应该知道的事情
  • 正确记录应用程序的10个技巧
  • 软件设计法则
  • Java最佳实践系列
  • 生存在荒野西部开发过程中的9条提示

翻译自: https://www.javacodegeeks.com/2011/10/java-secret-loading-and-unloading.html

key 和secret

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

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

相关文章

【Jenkins】未授权访问漏洞

一、漏洞介绍 1 ) Jenkins介绍 Jenkins是一个基于Java开发的开源项目&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可以独立运行&#xff0c;其功能如下&#xff1a; 用于持续性、自动的构建/测试软件项目监控或跑一些定时任务监控外部调用执行的工作 2 …

java split函数应该注意的问题

split函数的参数是一个String&#xff0c;但是这个String会被解释成一个正则表达式. 比如 "test.txt".split(".").length得到的值是0&#xff0c;因为在正则表达式中点号会被当作一个通配符, 所以得不到结果&#xff0c; 正确的写法应该是 "test.txt&…

解决谷歌浏览器F12打不开调试页面的问题。

最近应用着急上线&#xff0c;需要批量测试&#xff0c;发现F12不好使啦。 解决办法&#xff1a; 1.找到谷歌浏览器&#xff1a;设置-扩展程序-开发者模式。关闭。 2.刷新浏览器或者重启浏览器后&#xff0c;打开需要调试的页面&#xff0c;鼠标点一下地址栏&#xff0c;按F1…

还有另一个报告生成器?

如果您具有业务应用程序开发的经验&#xff0c;那么很可能会遇到要求该应用程序具有灵活的报告机制的需求。 我工作的公司主要专注于开发业务解决方案&#xff0c;而报告是必不可少的&#xff0c;的确&#xff0c;它必须包含我们开发的所有企业系统的方面。 为了在我们的系统中…

ARL资产侦察灯塔系统搭建及使用

ARL资产侦察灯塔系统搭建及使用 ARL&#xff08;Asset Reconnaissance Lighthouse&#xff09;资产侦查灯塔旨在快速发现并整理企业外网资产并为资产构建基础数据库&#xff0c;无需登录凭证或特殊访问即可主动发现并识别资产&#xff0c;让甲方安全团队或者渗透测试人员快速寻…

window电脑关闭自动更新的方法,妈妈再也不用担心我开机等电脑啦

公司的新电脑&#xff0c;每次关机开机都会更新&#xff0c;今天更新了3次&#xff0c;每次半小时&#xff0c;我忍不了&#xff0c;赶紧关闭自动更新。 1.winR打开面板输入services.msc&#xff0c;然后回车。 2.找到windows Update,右键找到 属性。 3.把启动类型改为“禁用”…

C#中 Convert与Parse的区别

1.Convert.ToDouble与Double.Parse的区别。实际上Convert.ToDouble与 Double.Parse 较为类似&#xff0c;实际上 Convert.ToDouble内部调用了 Double.Parse&#xff1a; (1)对于参数为null的时候&#xff1a;Convert.ToDouble参数为 null 时&#xff0c;返回 0.0&#xff1b; D…

常见的Web源码泄漏漏洞

常见的Web源码泄漏漏洞 1.Git 源码泄露 ​ 开发人员会使用 git 进行版本控制&#xff0c;对站点自动部署。但如果配置不当&#xff0c;可能会将 .git 文件夹直接部署到线上环境&#xff0c;这就引起了 git 泄露漏洞&#xff0c;我们可以利用这个漏洞直接获得网页源码 简要介…

我是如何解决电脑连接WiFi提示无线适配器或访问点有问题

今天国庆后第一天上班&#xff0c;打开电脑一直连接不上我手机的热点&#xff0c;提示无线适配器或访问点有问题。可能是由于重启电脑自动更新系统的缘故&#xff0c;关闭电脑自动更新的办法请参考我的上一篇文章&#xff1a;window电脑关闭自动更新的方法 不说废话&#xff0…

WebCombo 客户端绑定数据

///绑定webcombo1 var cbo igcmbo_getComboById(<%this.WebCombo2.ClientID %>); for (var i 0; i <4; i) { var row igtbl_addNew(cbo.grid.Id, 0); row.getCell(0).setValue("0.91");…

java ee cdi_Java EE6 CDI,命名组件和限定符

java ee cdiJava EE6的最大承诺之一就是简化了依赖注入的使用。 他们做到了&#xff0c;使用CDI 。 CDI代表Java EE的上下文和依赖注入&#xff0c;它提供了一个基础集&#xff0c;用于在企业应用程序中应用依赖注入。 在CDI之前&#xff0c;EJB 3还引入了依赖注入&#xff0c;…

如何使用git下载别人在github的代码?

今天东哥让我帮他们公司检查一下几十款产品的前端代码&#xff0c;我用新电脑作业了一下&#xff0c;简单分享git如何下载别人的代码。 完整教程请参考我上篇文章&#xff1a;——> Git教程学习总结 首先本地有git环境。打开git bash here。 查看一下版本 初始化git使…

AppScan的安装与使用

AppScan的安装与使用 实验环境&#xff1a;Win7 Win2k8 将软件包复制到这个目录下&#xff1a; 双击 复制到C盘&#xff1a; 复制到C盘的这个目录下&#xff0c;并替换&#xff1a; 然后到菜单栏中&#xff0c;双击查看&#xff1a; 这样就可以使用了: 使用App…

CocoaPods 安装和使用

一、《什么是CocoaPods》 官网描述&#xff1a;CocoaPods is the dependency manager for Swift and Objective-C Cocoa projects. It has almost ten thousand libraries and can help you scale your projects elegantly.(CocoaPods是一个独立的管理器&#xff0c;可以为Swif…

cmd黑窗口命令行模式进入指定盘符下的任意文件夹

通过使用命令&#xff0c;并加入参数 /d &#xff0c;可以通过一个步骤&#xff0c;直接进入指定盘符下的任意文件夹 比如要进入C盘下的C:\Users\Pactera\Desktop\rtt_web目录&#xff0c;则输入cd /d C:\Users\Pactera\Desktop\rtt_web

接口测试工具 restlet client

参考&#xff1a; https://blog.csdn.net/sunrainamazing/article/details/81281382https://blog.csdn.net/zlp1992/article/details/76706017 文章目录 下载若 你能翻墙下载 可以去如下网址下载方式二 采用离线CRX的方式进行安装(我用的第二种方式) 安装其次 &#xff0c; 一…

attr()与setAttribute()的区别

先看红色标注的&#xff1a; 这里传过来的this是个元素节点&#xff0c;因此currentTr也得用获取节点的方式parentNode去获取&#xff0c;而不能写parent()&#xff0c;这是第一个需要注意的地方。 第二个问题&#xff0c;就是怎么给currentTr设置属性和值得问题。我一开始想当…

我是如何成功准备VUE项目之前的开发环境?

提前安装好node, 参考我上一篇文章--------> 不同node.js版本 1.从git上把代码拷贝下来。 git clone +项目地址。 2.cmd模式下安装npm。 npm install 3.启动服务,npm run serve 。这里需要注意的是serve千万不要打成server啦,不然容易报错,这里还有两个小技…

moxy json介绍_通过MOXy实现使您的JAXB更清洁

moxy json介绍编组和解组XML时使用JAXB的主要优点是编程模型。 只需注释几个POJO并使用JAXB API&#xff0c;您就可以很容易地序列化为XML和从XML反序列化。 您无需担心有关XML如何编组/解组的细节。 一切都比DOM和SAX等替代方案简单得多。 现在&#xff0c;XML文件中的数据本质…

Tomcat样列目录session 操控漏洞

一、基本情况 漏洞级别&#xff1a;中危 漏洞类别&#xff1a;session操纵漏洞 二、问题描述 ApacheTomcat默认安装页面中存在examples样例目录。里面存放着Servlets、JSP、WebSocket的一些服务脚本和接口等样例。Servletsexamples服务样例下存在一个session的样例。该样例可…