> There is a handshake protocol between attach and HotSpot. Linux > VirtualMachineImpl sends SIGQUIT(3) if the AttachListener has not been > initialized. It expects "Signal Dispatcher" to handle SIGBREAK(same as > SIGQUIT) and create AttachListener. However, it is possible that attach > starts "handshake" before os::initialize_jdk_signal_support() is called. The > signal handler which handles SIGQUIT has not been installed. Prior to > os::initialize_jdk_signal_support(), universe_init() is called. Its time > complexity will be linear to the initial size of heap with 'AlwaysPreTouch'. > It takes 20~30 seconds to initialize 128g heap on a server-class host(eg. EC2 > m4.10xlarge). Many tools such jcmd, jstack etc may force initializing HotSpot > quit prematurely. > > This patch checks '/proc/$pid/stat' SigCgt bitmask to ensure the signal will > be caught by the target process before striking it with SIGQUIT. It will > make HotSpot more robust. The fields of procfs are well > [documented](https://www.kernel.org/doc/html/latest/filesystems/proc.html#id10) > and have supported since Linux 2.6.30. libattach.so will not the only > consumer of it. I see that os_perf_linux.cpp supports it in libjvm.so. > > > Testing > > Before, this patch, once initialization takes long time, jcmd may quit the > java process. > > $java -Xms64g -XX:+AlwaysPreTouch -Xlog:gc+heap=debug:stderr > -XX:ParallelGCThreads=1 & > [1] 9589 > [0.028s][debug][gc,heap] Minimum heap 68719476736 Initial heap 68719476736 > Maximum heap 68719476736 > [0.034s][debug][gc,heap] Running G1 PreTouch with 1 workers for 16384 work > units pre-touching 68719476736B. > $jcmd 9589 VM.flags > 9589: > [1] + 9589 quit java -Xms64g -XX:+AlwaysPreTouch > -Xlog:gc+heap=debug:stderr > java.io.IOException: No such process > at jdk.attach/sun.tools.attach.VirtualMachineImpl.sendQuitTo(Native > Method) > at > jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:100) > at > jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58) > at > jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207) > at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:113) > at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:97) > > With this patch, jcmd will timeout but won't disrupt 15274. > > $ java -Xms64g -XX:+AlwaysPreTouch -XX:ParallelGCThreads=1 & > [1] 15274 > $ jcmd 15274 VM.flags > 15274: > com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file > /proc/15274/root/tmp/.java_pid15274: target process 15274 doesn't respond > within 10500ms or HotSpot VM not loaded > at > jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:105) > at > jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58) > at > jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207) > at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:113) > at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:97)
Xin Liu has updated the pull request incrementally with one additional commit since the last revision: Intercept SIGQUIT in the early stage of HotSpot. ------------- Changes: - all: https://git.openjdk.java.net/jdk/pull/7003/files - new: https://git.openjdk.java.net/jdk/pull/7003/files/97143211..2f257539 Webrevs: - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=7003&range=01 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=7003&range=00-01 Stats: 53 lines in 2 files changed: 9 ins; 42 del; 2 mod Patch: https://git.openjdk.java.net/jdk/pull/7003.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/7003/head:pull/7003 PR: https://git.openjdk.java.net/jdk/pull/7003