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

时间:2015-02-06 09:33:22

标签: java gwt deobfuscation

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

在“超载”时刻,地图中包含16个段,第1个是59MB,第2个是30MB,第3个是29.9MB。

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

2 个答案:

答案 0 :(得分:1)

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

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

您可以在此处详细了解:Resymbolization / Deobfuscation

答案 1 :(得分:0)

我不会在生产部署中使用符号映射。 在war编译期间排除 symbolMaps 目录 <exclude name="WEB-INF/deploy/**" />。但最近我测试了gwt-log提供的远程日志记录功能的去混淆。

符号映射可以由-deploy "path"编译标志生成。 如果您在 gwt.xml 中使用<collapse-all-properties />,请注意忽略此标记。