繁体   English   中英

如何更改 Oracle JVM 核心转储文件的路径?

[英]How to change the path of Oracle JVM core dump file?

我目前使用的是JDK8,在17.4.2 Collect Core Dumps on Linux中,有如下描述:

默认情况下,核心转储是在进程的当前工作目录中创建的,核心转储文件的名称是 core.pid,其中 pid 是崩溃的 Java 进程的进程 ID。

但是我想改变核心转储的路径,有什么办法可以实现吗?

我使用sysctl -wq kernel.core_pattern=/opt/shared/core_%e.%p来设置它,但它不适用于JVM进程。

我用kill -11 java_pid来模拟这种情况,但是core dump是在JVM进程工作目录生成的,而不是我设置的目录。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f6249b4e4a5, pid=1, tid=0x00007f6249b3cb80
#
# JRE version: OpenJDK Runtime Environment (8.0_332-b09) (build 1.8.0_332-b09)
# Java VM: OpenJDK 64-Bit Server VM (25.332-b09 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libpthread.so.0+0xa4a5]  __pthread_clockjoin_ex+0x235
#
# Core dump written. Default location: /opt/core or core.1
#
# An error report file with more information is saved as:
# /opt/shared/java_error.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

[error occurred during error reporting , id 0xb]

:核心转储的路径只能通过更改进程工作目录来修改。

// Get the default path to the core file
// Returns the length of the string
int os::get_core_path(char* buffer, size_t bufferSize) {
  const char* p = get_current_directory(buffer, bufferSize);

  if (p == NULL) {
    assert(p != NULL, "failed to get current directory");
    return 0;
  }

  return strlen(buffer);
}

参考: jdk/os_linux.cpp at jdk8-b120·openjdk/jdk·GitHub

答案取决于您的 Java 版本和操作系统平台。

对于 Linux 上的 Java 8,该位置硬连线到当前目录。

对于 Linux 上的 Java 11 和 Java 17,JVM 使用更改核心转储的位置和其他地方中描述的 Linux“/proc/sys/kernel/core_pattern”机制。

在 BSD(例如 Darwin)上,该位置取决于 Java 版本:“/core”(硬连线)或操作系统内核提供的位置。

在 AIX 和 Windows 上,它似乎在所有 Java 版本中都使用当前目录。

等等。

(以上来自查看 Java 8、11 和 17 的 OpenJDK 源代码。请注意,相关代码在 Java 8 和 11 之间发生了很大变化。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM