我们的 Spring boot 应用程序在生产 Unix 环境中挂起。获取线程转储后,我们能够发现 UnixFileSystem 的 getSpace 方法被锁定。谁能帮我解决 java 调用 getSpace 方法时调用的 Unix 命令。
http-nio-8080-exec-1" - Thread t@45
java.lang.Thread.State: RUNNABLE
at java.io.UnixFileSystem.getSpace(Native Method)
at java.io.File.getUsableSpace(File.java:1885)
最佳答案
基本上是在 java.io.UnixFileSystem 中对 getSpace(...) 进行 native 调用:
/* -- Disk usage -- */
public native long getSpace(File f, int t);
这个本地方法最终通过 JNI 调用 JDK 存储库的这个文件中定义的方法:
https://github.com/openjdk/jdk/blob/master/src/java.base/unix/native/libjava/UnixFileSystem_md.c
在此文件的第 466 行,您可以找到以下实现(为简洁起见,省略了 if/else 语句中的部分):
JNIEXPORT jlong JNICALL
Java_java_io_UnixFileSystem_getSpace(JNIEnv *env, jobject this,
jobject file, jint t)
{
jlong rv = 0L;
WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) {
#ifdef MACOSX
struct statfs fsstat;
#else
struct statvfs64 fsstat;
int res;
#endif
memset(&fsstat, 0, sizeof(fsstat));
#ifdef MACOSX
if (statfs(path, &fsstat) == 0) {
switch(t) {
// omitted
}
}
#else
RESTARTABLE(statvfs64(path, &fsstat), res);
if (res == 0) {
switch(t) {
// omitted
}
}
#endif
} END_PLATFORM_STRING(env, path);
return rv;
}
关于java - 需要有关 java.io.UnixFileSystem.getspace 方法的信息,执行哪个 unix 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57992723/