符号缓存映射为 120MB - 它是什么以及它包含什么?

Symbol cache map is 120MB - what is it and what does it contain?

我们的项目中有一个 GWT 模块。最近有一个主要的内存过载,其中之一是存储在 StackTraceDeobfuscator.java ConcurrentHashMap<String, HashMap<String, String>> symbolMaps 字段中的 120MB 对象。它是什么,有什么用?

在 "the overload" 的那一刻,在地图包含的 16 个部分中,第一个是 59MB,第二个是 30MB,第三个是 29.9MB。

据我了解,这与代码被混淆和存储堆栈跟踪有关,但有人可以更详细地解释一下吗?是不是有太多带有巨大堆栈跟踪的异常,它们都被缓存了?但是 120MB 仍然很大,不是吗?

GWT 将尝试生成最少的 JavaScript 代码,以便在客户端进行更小的下载和更快的 JavaScript 解释。这包括将 Java 来源中使用的标识符缩短为可能的最短标识符。显然生成的短标识符名称对你(对人类)不是很有用。

如果出现任何错误,这意味着错误消息和堆栈跟踪不会包含对您有用的信息。为此,已实施 resymbolizitaion。如果提供了 -extra 编译器参数,则 符号映射 由 GWT 编译器(在编译时)生成。此符号映射包含从生成的短标识符到原始 Java 标识符的映射,因此如果出现错误,可以复制原始名称(只需从符号映射中查找)。

您可以在此处阅读更多相关信息:Resymbolization / Deobfuscation

我不在生产部署中使用符号映射。 symbolMaps 目录在 war 编译期间被排除 <exclude name="WEB-INF/deploy/**" />。但最近我测试了 gwt-log.

提供的远程日志记录功能的反混淆

符号映射可能由-deploy "path"编译标志生成。 如果您在 gwt.xml.

中使用 <collapse-all-properties />,请注意此标志将被忽略