本文介绍了在OSX上的Java文件的限制比在bash低的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我增加了最大文件限制对我的MacBook Pro,这样Elasticsearch可以与多个文件的工作,但它不工作。

我运行命令'的ulimit -a,它说打开文件为10万。我可以运行一个简单的shell脚本是这样的:

 出口计数器= 0
而(真);做触摸的/ tmp / foo的$ {}柜台;出口计数器=`$ expr的柜台+ 1`; DONE

和我能够创造大量的文件(超过60,000之前,我杀了脚本)。

不过,使用Java code创建中的/ tmp目录目录的空白子目录RandomAccessFiles,我只能让10232文件之前,我得到的错误:java.io.FileNotFoundException(打开的文件太多)。这里是我的Java code:

 进口java.io. *;
进口的java.util。*;公共类max_open_files {
    公共静态无效的主要(字符串参数... args)抛出异常{
        文件TESTDIR =新的文件(/ tmp目录/ tempsubdir);
        testDir.mkdirs();        清单<文件>文件=新的LinkedList<文件>();
        清单<&的RandomAccessFile GT;文件句柄=新的LinkedList<&的RandomAccessFile GT;();        尝试{
            而(真){
                文件f =新的文件(TESTDIRTMP+ fileHandles.size());
                RandomAccessFile的RAF =新RandomAccessFile的(F,RW);
                files.add(F);
                fileHandles.add(RAF);
            }
        }赶上(例外前){
            的System.out.println(ex.getClass()++ ex.getMessage());
        }        对于(RAF的RandomAccessFile:文件句柄)raf.close()        对于(F文件:文件)f.delete();        的System.out.println(最大打开文件:+ fileHandles.size());
    }
}

这java的code是类似于Elasticsearch的code,测试上的文件数量的限制(在MAXOPENFILES方法FileSystemUtils类)。所以Elasticsearch有我的Java程序有同样的问题。

在shell脚本为什么可以比Java code(我和Elasticsearch的)那么多的文件?为什么上的文件的数量高系统的限制没有得到由Java code识别?

更新5月13日下午4:50 CDT:我创建的测试程序的C版本,看看是否限为Java的具体,这似乎是如此。下面的C版本可以打开的文件32765,而在Java code被限制在10232的文件。

 的#include<&stdio.h中GT;
#包括LT&;&stdlib.h中GT;INT主(INT ARGC,为const char * argv的){
    字符名称[100];
    FILE * FP;
    INT NDX;    对于(NDX = 0;&NDX LT; 50000; NDX ++){
        sprintf的(名字,/tmp/foo%d.txt,NDX);
        FP = FOPEN(姓名,W);
        如果(FP == NULL){
            fprintf中(标准输出,无法创建文件%d个\\ N,NDX);
            返回1;
        }
        fprintf中(FP,你好%D,NDX);
    }    返回0;
}


解决方案

为Mac Java虚拟机选项参考

这篇关于在OSX上的Java文件的限制比在bash低的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 01:09