禁用/理解 java applet 类缓存行为

Posted

技术标签:

【中文标题】禁用/理解 java applet 类缓存行为【英文标题】:disable/understand java applet class cache behavior 【发布时间】:2014-02-06 22:36:28 【问题描述】:

我有一个 Java 小程序,我正在从分发无符号转换为有符号。签名版本的启动似乎较慢,在对此进行调查时,减速是与我的 Web 服务器的一系列连接,这些连接在未签名时很快,但在小程序签名时很慢。我一直在努力获得牵引力,因为我无法弄清楚为什么它首先建立连接,更不用说如何禁用该行为了。我也不清楚是什么创建了这些类,并且搜索涉及“Customizer”的 java 东西一直没有成效。

这是来自 java 控制台的相关输出(有一点明显的审查):

基本:已加载小程序。 基本:小程序调整大小并添加到父容器 基本:PERF:AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 279063 us,pluginInit dt 1299510 us,TotalTime:1578573 us 网络:找不到缓存条目 [url:MYHOSTURL/games/java/lang/ObjectCustomizer.class,版本:null] 网络:连接 MYHOSTURL/games/java/lang/ObjectCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/java/lang/ObjectCustomizer.class 与 cookie “STUFF” 网络:找到缓存条目 [url:MYHOSTURL/games/UnitValueCustomizer.class,版本:null] prevalidated=false/0 缓存:添加 MemoryCache 条目:MYHOSTURL/games/UnitValueCustomizer.class 缓存:资源 MYHOSTURL/games/UnitValueCustomizer.class 已过期。 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 cookie “STUFF” 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 cookie “STUFF” 缓存:资源 MYHOSTURL/games/UnitValueCustomizer.class 已过期。 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 cookie “STUFF” 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/UnitValueCustomizer.class 与 cookie “STUFF” 网络:找不到缓存条目 [url:MYHOSTURL/games/java/lang/ObjectCustomizer.class,版本:null] 网络:连接 MYHOSTURL/games/java/lang/ObjectCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/java/lang/ObjectCustomizer.class 与 cookie “STUFF” 网络:找不到缓存条目 [url:MYHOSTURL/games/BoundSizeCustomizer.class,版本:null] 网络:连接 MYHOSTURL/games/BoundSizeCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/BoundSizeCustomizer.class 与 cookie “STUFF” 网络:找不到缓存条目 [url:MYHOSTURL/games/BoundSizeCustomizer.class,版本:null] 网络:连接 MYHOSTURL/games/BoundSizeCustomizer.class 与 proxy=DIRECT 网络:连接 MYHOSTURL:80/ 与 proxy=DIRECT 网络:连接 MYHOSTURL/games/BoundSizeCustomizer.class 与 cookie “STUFF” 网络:连接 MYHOSTURL:3000/ 与 proxy=DIRECT 我的程序的第一个输出

(注意:发现的 UnitValueCustomizer 缓存条目是我放在 Web 服务器上的垃圾文件,只是为了看看会发生什么——尽管下载的是垃圾而不是类,但一切正常。)

列出的类(也没有“Customizer”一词)不会出现在应用程序的 java 源代码中,也不会出现在编译生成的 .class 或 .jar 文件中。没有“Customizer”的类名来自Miglayout。

因此,欢迎任何有关如何通过任何方式摆脱这种情况的提示,包括但不限于:

    如何告诉 VM 不要在提供的小程序 .jar 之外查找任何内容

    什么语言特性会产生这些幻像类以及如何避免这种情况

    有关此类加载机制或其名称的任何信息

【问题讨论】:

【参考方案1】:

如何告诉VM不要在提供的applet .jar之外寻找任何东西

这需要Special Attributes of Applets 中提到的codebase_lookup 参数。

例如

<APPLET ...>
<PARAM name="codebase_lookup" value="false">
</APPLET>

问题 2. 和 3. 的最佳答案是,它是 JVM 的一个特性,可以通过 codebase_lookup 参数进行配置。以任一方式加载的类加载器与URLClassLoader 完全相同,只是配置了不同的类路径。

codebase_lookup: false 仅包括在 archive 属性中定义的罐子。 codebase_lookup: true(未指定时为默认值)不仅包括在 archive 属性中定义的 Jars,还包括小程序 codebase 本身 - 用于搜索不在 Jar 中的资源。

【讨论】:

以上是关于禁用/理解 java applet 类缓存行为的主要内容,如果未能解决你的问题,请参考以下文章

你能帮我理解 ARM Cortex-A9 上的缓存行为吗?

Java类基本结构的理解

Spring 测试:测试类之间的上下文配置缓存的奇怪行为?

java中对于多态的理解

理解Java Integer的缓存策略

理解Java Integer的缓存策略