【发布时间】:2019-11-04 15:06:09
【问题描述】:
我已经搜索了很多关于该主题的内容。但没有具体的解决方案/指南。
来自docs,
某些虚拟机可能会在某些情况下省略一个或 来自堆栈跟踪的更多堆栈帧。在极端情况中,一个 没有与此相关的堆栈跟踪信息的虚拟机 允许 throwable 从此方法返回一个长度为零的数组。
有人可以阐明这可能/将会发生的条件吗?
我知道如果一遍又一遍地产生相同的堆栈跟踪,就会发生这种情况(计数没有硬性规定,AFAIK- 否则请纠正我)。但这不是有一个明确的行为吗?
另外,根据this,传递-XX:-OmitStackTraceInFastThrow 将确保我的StackTrace 不会丢失。在生产机器上总是这样做不是明智的吗?
【问题讨论】:
-
性能。如果它一遍又一遍地生成相同的堆栈跟踪,就会发生这种情况。
-
回复:极端情况。我认为如果 JVM 正在生成内存不足的错误,例如,它甚至可能没有足够的内存来构建堆栈跟踪,所以它必须是空的。
-
如果内存消耗如此严重,那么抛出 OOM 比“静默”抑制堆栈跟踪要好,对吧?
-
"在生产机器上总是这样做不是很明智吗?" 不。我们的生产机器已启用此功能。我们更关心性能提升,而不是每次都获取完整的堆栈跟踪。如果省略,则表示已经生成。要获取完整的堆栈跟踪,只需转到日志中的第一次出现。
-
我不明白你的意思。总是抛出 OOM 异常。只是抛出的OOM是否包含堆栈跟踪。如果没有内存来生成它,别无选择,只能扔掉它。
标签: java exception jvm stack-trace