总览

首先,很自然地假设静态字段具有特殊的生命周期,并且在应用程序的生命周期中一直存在。 您可以假设它们存在于内存中的特殊位置,例如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

Java Secret:加载和卸载静态字段相关推荐

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

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

  2. java无法加载Label_java-Label的labelFor字段无法正常运行

    Label对象的labelFor字段的用途到底是什么? 昨天是我第一次听说有关JavaFX的内容,因此,如果听起来完全愚蠢,我深表歉意.标签这个词在HTML节点中似乎是我熟悉的.因此,我认为label ...

  3. URLClassLoader热加载、卸载,自定义热加载数据池 jar包(附:Springboot + Hutool-db 使用实例)

    参考文章: 利用classloader实现jar包的加载和卸载,实现类的热替换 动态添加classpath 关于ClassLoader.getSystemClassLoader()和Thread.cu ...

  4. java 动态加载jni_JNI静态注册与动态注册详解

    JNI注册,是指将java层方法(native关键字修饰的)和C层方法对应起来,以实现java层代码调用c层代码的目的.JNI注册分为静态注册和动态注册两种,静态注册是通过固定格式方法名进行关联,动态 ...

  5. 原来热加载如此简单,手动写一个 Java 热加载吧

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  6. java热加载_java--热加载

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  7. 【翻译】WF从入门到精通(第六章):加载和卸载实例

    上一篇:[翻译]WF从入门到精通(第五章):workflow跟踪 学习完本章,你将掌握:     1.理解工作流实例为什么要卸载和重新加载及其时机     2.理解工作流实例为什么要持久化及其时机   ...

  8. java class文件 代码_java_基础——用代码编译.java文件+加载class文件

    java_基础--用代码编译.java文件+加载class文件 java_基础--用代码编译.java文件+加载class文件 [简单编译的流程] package com.zjm.www.test; ...

  9. Java动态加载类(对反射的基本理解)

    目录 基本概念 演示 基本概念 这里演示下Java的动态加载类.因为在编译的时候,加载类是静态加载,运行时加载是动态加载. 在此我对反射有了如下的理解: 如果有一个class A,可以使用new A( ...

最新文章

  1. 心得丨深度学习的技术原理、迭代路径与局限
  2. java执行Linux shell命令或者Window cmd命令
  3. Magento 2数据库EAV模型结构
  4. Spring 2.x AOP 配置方式整理
  5. 银行产生的烂账是如何处理的?
  6. xp系统怎样添加桌面计算机名,教你win10系统电脑桌面怎么添加日历
  7. 蓝屏分析_电脑突发蓝屏现象?教你如何快速修复
  8. HL7数据类型分析(1)
  9. 禁止迅雷:迅雷服务器地址大全+ISA计算机集(xml)
  10. UVA722 LA5359 Lakes【DFS】
  11. Dapper.net 入门demo 轻量级ORM框架
  12. visual studio 2015安装教程
  13. hash表的一些基本知识
  14. 常用智能小车电机驱动模块选型
  15. linux服务器突然有大量连接,linux服务器出现丢包的解决方法
  16. 线性代数的那些事(二)行列式与逆
  17. 和差化积公式 和 积化和差公式
  18. 为什么 K8s 在阿里能成功(转)
  19. 【Java基础】二、大厂都开始重视的基础很重要吗?快来加入基础的学习,巩固一下细枝末角,刷刷面试题吧
  20. python 百度云盘 数据迁移_python爬虫,爬取百度云盘,找你兄弟的机器活塞运动原理文件?...

热门文章

  1. graal java_如何在CircleCI上构建支持Graal的JDK8?
  2. vmware用户名和密码_VMWare vijava –“用户名或密码不正确”异常的奇怪情况
  3. jwt令牌_jwt-cli:用于解码JSON Web令牌(JWT令牌)的Shell库
  4. npm 引用子项目模块_Java / Web项目中的NPM模块Browser-Sync
  5. junit测试spring_使用Spring JUnit规则进行参数化集成测试
  6. spring javaee_JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!
  7. c++ lambda 重载_您会后悔对Lambdas应用重载!
  8. jdk8分组统计字段和_JDK 8流和分组
  9. saml2_向SAML响应中添加自定义声明–(如何为WSO2 Identity Server编写自定义声明处理程序)...
  10. Apache Ranger插件的美丽简洁