我们的项目中有一个GWT模块。最近有一个主要的内存重载,其中一个是存储在StackTraceDeobfuscator.java ConcurrentHashMap<String, HashMap<String, String>> symbolMaps
字段中的120MB对象。它是什么,它有什么用?
在“超载”时刻,地图中包含16个段,第1个是59MB,第2个是30MB,第3个是29.9MB。
据我了解,这与代码被混淆并存储堆栈跟踪这一事实有关,但是有人可以请更详细地解释一下吗?是不是,有太多的异常与巨大的堆栈跟踪,他们都被缓存?但120MB仍然很大,不是吗?
答案 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 />
,请注意忽略此标记。