我在接受采访时听到了这个问题,无法提供答案.后来我通过互联网搜索,仍然没有找到答案.任何人都可以告诉我JVM如何在收集垃圾时停止世界时停止线程以及它如何再次运行它们.
Get<PrimitiveType>ArrayElements系列函数被记录为复制数组,或将它们固定到位(并且这样做,防止压缩垃圾收集器移动它们).它被记录为一种更安全,限制性更小的替代方案GetPrimitiveArrayCritical.但是,我想知道哪些虚拟机和/或垃圾收集器(如果有的话)实际固定数组而不是复制它们.
从Java的字节码调用机器代码时是否有任何性能影响?由于机器代码是"非托管"的,并且它没有"意识到"Java的内部结构,这可能导致JVM的内部调度程序暂停或类似的东西?
我是Java的新手,所以也许这甚至不相关,请帮忙.
我知道在Erlang中他们遇到了这个问题,VM在调用机器代码时基本停止了.我希望Java不是这种情况.是吗?
我们有一个Java应用程序,它具有一个多线程(pthread)的JNI层,并将根据从底层网络收到的消息回调Java级别.
我们注意到每次崩溃都是由gc引起的.我们甚至可以通过jmap -histo <pid>在JNI层从网络接收消息时通过调用手动触发gc来模拟这种崩溃.
鉴于我们在本文中的GC期间读到的有关JVM行为的信息,/sf/answers/2758102721/,我们仍然无法弄清楚为什么这样的崩溃与gc相关,因为JNI函数调用在gc期间被阻止.
如果有人能够阐明这一点,那就太好了.提前致谢.
以下是我们在应用程序崩溃后收集的堆栈跟踪.
Program terminated with signal 6, Aborted.
#0 0x0000003cdce325e5 in raise () from /lib64/libc.so.6
#1 0x0000003cdce33dc5 in abort () from /lib64/libc.so.6
#2 0x00007fdafe2516b5 in os::abort(bool) () from /usr/java/jdk1.8.0_65/jre/lib/amd64/server/libjvm.so
#3 0x00007fdafe3efbf3 in VMError::report_and_die() ()
from /usr/java/jdk1.8.0_65/jre/lib/amd64/server/libjvm.so
#4 0x00007fdafde2f3e2 in report_vm_error(char const*, int, char const*, char const*) ()
from /usr/java/jdk1.8.0_65/jre/lib/amd64/server/libjvm.so
#5 0x00007fdafe24c1ff in os::PlatformEvent::park() ()
from /usr/java/jdk1.8.0_65/jre/lib/amd64/server/libjvm.so
#6 0x00007fdafe20c538 in Monitor::ILock(Thread*) ()
from /usr/java/jdk1.8.0_65/jre/lib/amd64/server/libjvm.so
#7 0x00007fdafe20c73f in Monitor::lock_without_safepoint_check() ()
from /usr/java/jdk1.8.0_65/jre/lib/amd64/server/libjvm.so
#8 …Run Code Online (Sandbox Code Playgroud)