OpenJ9堆转储中字节数组内容全为0,如何查看真实内容?
解决OpenJ9堆转储中byte数组内容全为0的问题
我来帮你拆解这个问题——你遇到的byte数组全是0的情况,其实是OpenJ9堆转储的默认优化策略导致的,咱们一步步说清楚:
为什么会出现全0的byte数组?
OpenJ9默认生成堆转储时,为了减小文件体积,会跳过存储数组的原始内容,转而用0填充这些数组空间。当你直接运行jcmd <pid> GC.heap_dump时,没有指定强制保留数据的参数,就会触发这个行为,所以MAT里看到的都是占位用的0,不是真实的数组内容。
现有堆转储文件能恢复真实内容吗?
很遗憾,不行。因为默认生成的堆转储里根本就没有写入真实的byte数组数据,那些0是填充的占位符,没有办法逆向还原出原始内容。
怎么生成包含真实数据的堆转储?
你只需要给jcmd命令加上-all参数,这个参数会告诉OpenJ9保留所有对象的原始数据,包括数组内容:
jcmd <pid> GC.heap_dump -all <你的堆转储文件路径>
另外,也可以用OpenJ9自带的jmap工具(注意和HotSpot版本的jmap参数有区别),通过以下命令生成完整堆转储:
jmap -dump:format=b,file=<你的堆转储文件路径>,full <pid>
用这两种方式生成的堆转储,再导入MAT就能看到byte数组的真实内容了。
额外提醒
完整堆转储的文件大小会比默认的大很多,尤其是你的应用里有大量大尺寸byte数组的情况,一定要提前确认磁盘有足够的存储空间。如果是在容器环境中运行,还要注意容器的磁盘配额限制,避免因为转储文件过大导致容器异常。
内容的提问来源于stack exchange,提问作者Anderson Fachini
相关产品推荐
相关产品推荐

