Eclipse打开文件太多Error

http://shjy-nicholas.iteye.com/blog/413483


之前在项目里,一个Weblogic部署了4个工程,有时候甚至到5个,所以经常能在weblogic的nohup.out中看到Weblogic一直在报Too Many Files Open的错。
今天在自己的系统里也惊奇的出现了这样的错,于是下决心找到解决方案。
在Google里找到一些解决方案,都不太行,
最后,找到了一个可以的方法:
修改/etc/security/limits.conf
用gedit,或者vim,只要你常用的编辑器,打开这个文件后,
在末尾添加* - nofile 8192
这里的*代表对所有的用户,如果你只针对某个用户修改,就将*修改为用户名。
登出,再登录,用ulimit-a查看修改的结果,可以看到
open files                      (-n) 8192

再贴一段我在查资料的时候找到的信息,以供扩展阅读:

注意"nofile"项有两个可能的限制措施。就是<type>项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定<type>, 则hard和soft设定会同时被设定。
硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。
当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。
最后用ulimit -a再次查看,open files的值,没什么问题的话,就已经改过来了。

<think>嗯,用户遇到了Java的堆内存不足问题,需要解决OutOfMemoryError。首先,我得回想一下相关的知识。堆内存不足通常是因为应用程序需要的内存超过了JVM分配的堆大小。可能的解决方法包括调整JVM参数、优化代码、分析内存泄漏等。 根据引用[3],这个错误是因为JVM的堆内存不足。所以第一个解决方案应该是增加堆内存的大小,比如通过-Xmx参数设置最大堆内存。但用户可能已经尝试过这个方法,或者问题可能由内存泄漏引起,这时候需要进一步分析。 接下来要考虑内存泄漏的情况。用户可能需要使用工具如VisualVM或Eclipse MAT来分析堆转储,找出哪些对象占用了大量内存却没有被释放。比如,长时间持有对象的引用,或者集合类未正确清理等。 另外,代码优化也是关键。检查是否有不必要的对象创建,特别是在循环中。例如,字符串拼接使用StringBuilder代替String可以减少内存消耗。同时,及时关闭资源如数据库连接、文件流,可以防止资源泄露导致的间接内存问题。 还有可能用户在处理大数据时没有分页或分批处理,导致一次性加载过多数据到内存。这时候建议分批次处理数据,减少单次内存占用。 引用[1]和[2]提到的解决方案包括调整JVM参数和优化程序,所以需要综合这些方法。可能需要分步骤指导用户:首先调整参数,如果问题依旧,再分析内存使用情况,最后优化代码或数据处理逻辑。 用户可能不太清楚如何生成堆转储文件,所以需要说明如何使用-XX:+HeapDumpOnOutOfMemoryError参数,或者在出现错误后使用jmap命令。同时,解释如何利用MAT等工具分析这些文件,找到泄漏源。 另外,如果应用程序确实需要更多内存,除了增加堆大小,还可以考虑优化垃圾回收策略,选择合适的GC算法,比如G1GC,可能提高回收效率,减少停顿时间,间接缓解问题。 最后,可能需要提醒用户,如果问题依然存在,可能需要横向扩展,比如增加服务器内存或分布式处理,但这可能超出单机优化的范围,属于架构层面的调整了。</think>### 分步解决方案:解决Java堆空间不足异常 #### **1. 调整JVM堆内存参数** - **操作**:通过JVM启动参数增大堆内存上限。 ```shell java -Xms512m -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -jar your_application.jar ``` - `-Xms512m`:初始堆内存设为512MB - `-Xmx4g`:最大堆内存设为4GB(根据实际需求调整) - `-XX:+HeapDumpOnOutOfMemoryError`:在内存溢出时生成堆转储文件(后缀为.hprof)[^3] #### **2. 分析内存泄漏** - **工具**:使用VisualVM、Eclipse Memory Analyzer(MAT)或JProfiler分析堆转储文件。 - **步骤**: 1. 打开MAT并加载.hprof文件 2. 查看「Dominator Tree」或「Histogram」找到占用内存最多的对象 3. 检查对象的引用链,定位未释放的代码位置[^1] #### **3. 优化代码逻辑** - **减少对象创建**:避免在循环内频繁创建对象,使用对象池或复用对象。 示例:将字符串拼接改为`StringBuilder`: ```java // 低效写法 String result = ""; for (int i = 0; i < 10000; i++) { result += i; } // 高效写法 StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString(); ``` - **释放资源**:确保数据库连接、文件流等资源使用后关闭: ```java try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { // 操作文件 } catch (IOException e) { e.printStackTrace(); } ``` #### **4. 优化数据处理方式** - **分批次处理**:对大文件或数据库查询结果分批读取,避免一次性加载全部数据。 ```java int batchSize = 1000; List<Data> batchList = new ArrayList<>(); while (hasMoreData()) { Data data = fetchNextData(); batchList.add(data); if (batchList.size() == batchSize) { processBatch(batchList); batchList.clear(); } } if (!batchList.isEmpty()) { processBatch(batchList); } ``` #### **5. 调整垃圾回收策略** - **选择高效GC算法**:如G1垃圾回收器: ```shell java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar your_application.jar ``` - `-XX:+UseG1GC`:启用G1回收器 - `-XX:MaxGCPauseMillis=200`:设定最大GC停顿时间目标[^2] --- ### **补充说明** 若上述方法仍无法解决问题,可考虑: 1. **横向扩展**:通过集群部署分散内存压力 2. **第三方内存管理库**:如Apache Ignite实现分布式堆外缓存 3. **JVM升级**:新版JDK(如JDK17+)的ZGC或ShenandoahGC可显著降低停顿时间 --- ### **相关问题** 1. 如何解读MAT分析报告中的「Shallow Heap」与「Retained Heap」区别? 2. 哪些情况会导致Java内存泄漏? 3. G1垃圾回收器相比CMS有哪些优势?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值