禁用/理解 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 类缓存行为的主要内容,如果未能解决你的问题,请参考以下文章