java - 需要有关 java.io.UnixFileSystem.getspace 方法的信息,执行哪个 unix 命令?

标签 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.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;
}

如您所见,如果您使用的是 MACOSX,则 C 库函数 statfs被调用,否则函数 statvfs64被称为。

关于java - 需要有关 java.io.UnixFileSystem.getspace 方法的信息,执行哪个 unix 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57992723/

相关文章:

Java : No suitable MessageConvertor found when using RestTemplate

java - 为什么 getName() 返回 null?

c - 指向 C 中指针的指针

unix - 使用 tsch 从文本文件中分离电子邮件地址

JAVAFX 除了使用时间轴之外,还有哪些其他方法可以使标签闪烁?

unix - Red Hat 上的 CuRL SSL 握手问题

linux - 运行数十小时后远程集群出现奇怪的 "Stale file handle, errno=116"

database - 将图像(jpg、gif、png)存储在文件系统或数据库中?

java - ViewPart 或编辑器中的 Eclipse RCP 文件浏览器?

java - @MessageMapping 返回上的 STOMP header