Skip to content

Instantly share code, notes, and snippets.

@apangin
Created December 11, 2020 01:26
Show Gist options
  • Save apangin/8a26a026efab87c5778fb89706f5712a to your computer and use it in GitHub Desktop.
Save apangin/8a26a026efab87c5778fb89706f5712a to your computer and use it in GitHub Desktop.
Change MaxJavaStackTraceDepth JVM flag in runtime
import sun.jvm.hotspot.debugger.Address;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* Changes -XX:MaxJavaStackTraceDepth flag to 1000000 in runtime
* without restarting the JVM.
* See https://stackoverflow.com/q/65239783/3448419
*
* How to run on JDK 8:
* java -cp .:$JAVA_HOME/lib/sa-jdi.jar ChangeVMFlag <pid>
*
* On Java 9+:
* java --add-modules=jdk.hotspot.agent \
* --add-exports jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED \
* --add-exports jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED \
* --add-exports jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED \
* ChangeVMFlag <pid>
*/
public class ChangeVMFlag extends Tool {
private static String pid;
@Override
public void run() {
Address addr = VM.getVM().getCommandLineFlag("MaxJavaStackTraceDepth").getAddress();
long addrValue = VM.getVM().getDebugger().getAddressValue(addr);
try (RandomAccessFile raf = new RandomAccessFile("/proc/" + pid + "/mem", "rw")) {
raf.seek(addrValue);
raf.writeInt(Integer.reverseBytes(1_000_000));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
pid = args[0];
new ChangeVMFlag().execute(new String[]{pid});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment