- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当通过 Thread#getStackTrace()
或 ThreadMXBean#getThreadInfo(long[], int)
从另一个线程请求堆栈跟踪时,是否所有线程都必须输入一个安全点,因此必须等到所有其他线程都进入安全点?
This blog似乎暗示是这样的:
You hit a global safepoint whether you are sampling a single thread or all threads (at least on OpenJDK, Zing is slightly different but as a profiler vendor OpenJDK is your assumption.)
这意味着从单个线程获取堆栈跟踪与获取所有堆栈跟踪一样具有侵入性(就由于全局安全点命中频率增加而导致的高开销而言)。
但这对 OpenJDK 来说实际上/仍然如此吗?您是否有关于为什么会这样或相关源代码的任何指示?
最佳答案
在 OpenJDK 中(直到当前的 JDK 13)Thread.getStackTrace()
仍然在全局 stop-the-world 安全点运行:
public StackTraceElement[] getStackTrace() {
if (this != Thread.currentThread()) {
....
StackTraceElement[][] stackTraceArray = dumpThreads(new Thread[] {this});
这下降到 ThreadService::dump_stack_traces ,它执行 VM_ThreadDump
VM 线程中的操作。所有 VM_*
操作都用于在全局安全点运行。
JEP 312: Thread-Local Handshakes在 JDK 10 中引入,提供了每线程安全点机制。现在VM_Handshake
及其所有后代都不需要全局安全点:
class VM_Handshake: public VM_Operation {
const jlong _handshake_timeout;
public:
bool evaluate_at_safepoint() const { return false; }
但是,VM_ThreadDump
不是这样的操作。 VM_GetStackTrace
也不是用于实现JVM TI GetStackTrace函数。
有一个 Unresolved 问题 JDK-8201641将来某个时间利用线程本地握手获取单个线程的堆栈跟踪。
关于java - 从特定线程请求堆栈跟踪是否需要所有线程都处于安全点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59171277/
我是一名优秀的程序员,十分优秀!