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

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

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

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

  2. 通过应用程序域AppDomain加载和卸载程序集之后,如何再返回原来的主程序域

    实现目的:动态加载dll,执行完毕之后可以随时卸载掉,并可以替换这些dll,以在运行中更新dll中的类. 其实就是通过应用程序域AppDomain加载和卸载程序集. 在这方面微软有篇文章http:// ...

  3. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...

    原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件. 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unloa ...

  4. C#中动态加载和卸载DLL

    在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实 ...

  5. U3D assetbundle加载与卸载的深入理解

    U3D assetbundle加载与卸载的深入理解 using UnityEngine; using System.Collections; using System;public class tes ...

  6. C# 动态加载 动态卸载

    代码 using System; using System.Collections.Generic; using System.Text; using System.Threading; using  ...

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

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

  8. 7. Oracle数据加载和卸载

    在日常工作中:经常会遇到这样的需求: Oracle 数据表跟文本或者文件格式进行交互:即将指定文件内容导入对应的 Oracle 数据表中:或者从 Oracle 数据表导出. 其他数据库中的表跟Orac ...

  9. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集...

    本博客中以"C#.Net 如何动态加载与卸载程序集(.dll或者.exe)"开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有 ...

最新文章

  1. Winograd,GEMM算法综述(CNN中高效卷积实现)(上)
  2. 如何用php弄导航栏,怎样用PHP来给网页做导航栏
  3. 漫水填充算法 - cvFloodFill() 实现
  4. Net混淆与用de4dot工具破解
  5. WUTOJ 1284: Gold Medal(Java)
  6. 疯狂了!当游戏爱上MongoDB会怎么样???
  7. linux安装java的脚本吗,Linux安装JDK脚本
  8. 一个最简单的Makefile例子(转)
  9. opencv中的矩阵拼接
  10. 关于MySqlConnection的一个特殊异常
  11. linux usb 驱动漏洞,不测不知道 这么多的USB漏洞要从何“补”起?
  12. Kafka常用命令之kafka-console-consumer.sh
  13. ibatis Clob对象处理
  14. VS开发工具常用插件
  15. 使用soap遇到的缓存问题
  16. ENVI/IDL编程:相对辐射校正-直方图匹配
  17. 有一份好看的简历,面试都要加分,推荐好看的简历来这里下载
  18. ionic2中的订单详情页面
  19. 电子警察的系统结构和功能设计
  20. 白糖详细 制造工艺、等级划分、国家标准号和注意事项

热门文章

  1. 公众号新上线微信小游戏(疯狂猜图)
  2. JAVA常用的环境变量配置
  3. 用rollback()VS不用rollback()
  4. 2.Idea分支的merge
  5. android roboguice2,Android快速开发框架 roboguice
  6. apache shiro怎么升级_Springboot整合Shiro之授权
  7. spring order_Spring @Order批注
  8. 世界是沙粒还是宇宙_看到一个沙粒世界:再一次你好世界
  9. java 示例_功能Java示例 第5部分–将I / O移到外部
  10. enumset_枚举集合的EnumSet