需要关于java.io.UnixFileSystem.getspace方法的信息,执行哪个unix命令?
我们的Spring boot应用程序在生产Unix环境中挂起。在获得线程转储后,我们能够发现UnixFileSystem的getSpace方法被锁定。有谁能帮助我使用当java调用getSpace方法时调用的Unix命令吗需要关于java.io.UnixFileSystem.getspace方法的信息,执行哪个unix命令?,java,unix,filesystems,Java,Unix,Filesystems,我们的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.
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(…)进行本机调用: 此本机方法最终通过JNI调用JDK存储库文件中定义的方法:
在该文件的第466行,您可以找到以下实现(为了简洁起见,省略了if/else语句中的部分):
如您所见,如果您使用MACOSX,则会调用C库函数,否则会调用该函数。这里有一个问题与您的问题类似:它有两个向上投票的答案,因此可能会对您有所帮助。此外,文件位于何处?本地文件系统或NFS或其他文件位于NFS。我们的应用程序所在的linux服务器似乎运行不正常,这帮助我找到了根本原因。我可以假设dfunix命令在内部调用statvfs64吗?不,df命令使用的调用与JDK调用不完全相同(尽管我认为它们最终归结为几乎相同的系统调用)。如果你感到勇敢,你可以看看!最后,您将找到实用程序的main()函数。
/* -- Disk usage -- */
public native long getSpace(File f, int t);
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;
}