An internal error occurred during: "Building workspace". Java heap space

本文介绍了解决MyEclipse在导入大型项目时出现的内存溢出问题的方法。通过修改myeclipse.ini文件中的堆内存和非堆内存设置来避免错误。提供了具体的配置示例并解释了-Xms、-Xmx、-XX:PermSize和-XX:MaxPermSize等参数的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

An internal error occurred during: "Building workspace". Java heap space

今天MyEclipse导入了一个比较大的项目,出现了an internal error occurred during building workspace错误。

网上搜了一下,据说是内存溢出问题。可以通过修改myeclipse.ini 文件解决,一例如下。

优化之后的ini文件内容:

-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m

--launcher.defaultAction
openFile

-vm
C:\java\1.6\bin

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m

 

以下为查找得的一些资料,解释我们在修改的参数是什么意思。


        1. 堆(Heap )和非堆(Non-heap )内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。

        2. 堆内存分配
       JVM初始分配的内存-Xms 指定,默认是物理内存的1/64;JVM最大分配的内存-Xmx 指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。

         3.非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

         4. JVM内存限制 (最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间 有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G- 3G),而64bit以上的处理器就不会有限制了。

        举例说明含义:
         -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB,初始分配
        -Xmx512m 表示JVM Heap(堆内存)最大允许的尺寸256MB,按需分配。

    说明:如果-Xmx不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM不是Throwable的,无法用try...catch捕捉。

        PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanate generation)如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中。
        -XX:PermSize=64MB 最小尺寸,初始分配 
         -XX:MaxPermSize=256MB 最大允许分配尺寸,按需分配
         过小会导致:java.lang.OutOfMemoryError: PermGen space
          MaxPermSize缺省值和-server -client选项相关。-server选项下默认MaxPermSize为64m
          -client选项下默认MaxPermSize为32m

        PS: 不同厂家的jdk垃圾回收算法不一样 。在sun的jdk下,Xms和Xmx设置一样,可以减轻伸缩堆大小带来的压力,但在ibm的jdk下面,设置为一样会增大堆碎片产生的几率。

        下面再简单的整理一下 优化MyEclipse速度 的主要方法:
         1.修改myeclipse.ini。
        2.取消自动validation
        3.勾掉无用插件。
        4.修改启动加载模块

注::版本EasyEclipse for PHP 1.2.2.2的配置文件是eclipse.ini,修改办法如下:
把原来的改为这个即可,
-vmargs
-Xms128m
-Xmx1024m
-XX:MaxPermSize=512m


        下面附上详细的优化MyEclipse速度方法:( 转载
        http://yufenfei.javaeye.com/blog/376464
        http://blog.youkuaiyun.com/defonds/archive/2009/07/10/4338782.aspx
        http://zhangpengshou.javaeye.com/blog/198476

        http://queue19.javaeye.com/blog/488017

<think>嗯,用户遇到了一个错误:“An internal error occurred during: 'Items filtering'. java.lang.ExceptionInInitializerError”。我需要帮他们解决这个问题。首先,我得理解这个错误的含义。ExceptionInInitializerError通常表示在类的静态初始化过程中出现了异常,导致类无法正确加载。这可能是因为静态块、静态变量初始化或者静态方法中抛出了异常。 接下来,用户可能是在使用Eclipse或者其他IDE时遇到了这个问题,特别是在进行某些操作时触发了“Items filtering”,比如搜索、内容辅助(代码补全)或者过滤项目列表的时候。错误提示中的“Items filtering”可能指的是IDE在处理某些项目或元素时的过滤操作。 我需要考虑可能的原因。首先,静态初始化错误可能来源于项目依赖的某个库版本不兼容,或者存在损坏的JAR文件。也有可能是插件冲突,特别是用户提到HANA插件,可能相关的依赖存在问题。另外,内存问题或者IDE本身的配置错误也可能导致此类错误。 接下来,我应该分步骤给出解决方案。首先,建议用户检查错误日志的堆栈跟踪,这是定位问题的关键。然后,检查最近的更改,比如新安装的插件或更新的依赖。之后,验证类路径和依赖项,特别是Apache HttpClient相关的库,因为之前的对话中用户提到过这个库。清理和重建项目,以及重启IDE也是常见的解决步骤。如果问题依旧,可能需要检查插件兼容性或调整JVM内存设置。 用户可能对如何查看错误日志的详细信息不太清楚,所以需要指导他们如何找到日志文件,比如在Eclipse中的.metadata/.log。同时,用户可能需要帮助理解如何检查依赖项的版本,特别是使用Maven或Gradle的项目,或者手动检查JAR文件。 另外,ExceptionInInitializerError可能有更深层次的原因,比如静态代码块中的资源加载失败,或者第三方库的bug。这时候,建议用户更新依赖到最新稳定版,或者回退到已知良好的版本可能会有帮助。 如果用户是开发者,可能还需要指导他们如何在代码中定位静态初始化块的问题,比如检查自定义的静态初始化部分是否有潜在的错误。对于非技术用户,可能需要更详细的步骤,比如截图或具体的菜单导航路径。 最后,确保提供的解决方案覆盖了常见的可能性,并且步骤清晰,用户可以逐步排查。如果所有方法都无效,建议联系官方支持或社区寻求帮助,并提供必要的环境信息。</think>以下是针对`"Items filtering"`操作时出现`java.lang.ExceptionInInitializerError`错误的 **深度排查与解决方案**: --- ### **核心问题定位** 该错误表示 **类静态初始化失败**,通常由以下原因引发: - 静态代码块(`static{}`)执行异常 - 静态变量初始化抛出错误 - 依赖的第三方库版本冲突 - JVM内存不足导致类加载失败 --- ### **分步解决方案** #### **1. 查看完整堆栈跟踪** ```java // 在Eclipse错误对话框中点击"Details"按钮 // 重点关注Caused by部分的首个异常: Caused by: java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient at com.sap.plugin.FilterProcessor.<clinit>(FilterProcessor.java:42) // 定位静态初始化位置 ``` #### **2. 检查近期变更** ```text a. 最近安装/更新的插件(Help > About > Installation Details) b. 项目pom.xml/gradle.build文件新增的依赖 c. workspace/.metadata/.plugins下配置文件的修改时间 ``` #### **3. 关键依赖验证** 使用以下命令检查HTTP库版本(适用于Maven项目): ```bash mvn dependency:tree -Dincludes=org.apache.httpcomponents # 预期输出示例: # [INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.13:compile ``` #### **4. 内存问题排查** 修改`eclipse.ini`调整JVM参数: ```ini -Xms1024m -Xmx2048m -XX:MaxPermSize=512m # 仅限JDK 8 -XX:+UseG1GC ``` #### **5. 静态资源清理** ```text a. 项目根目录执行 mvn clean 或 gradle clean b. 删除workspace/.metadata/.plugins/org.eclipse.core.resources c. 重启Eclipse时添加 -clean 参数 ``` --- ### **高频冲突场景对照表** | 现象特征 | 解决方案 | |------------------------------|--------------------------------------------------------------------------| | 控制台出现`LinkageError` | 在`MANIFEST.MF`中添加排除规则:`Eclipse-BuddyPolicy: dependent` | | 错误涉及`Xerces`/`Xalan` | 在`pom.xml`中添加显式依赖:`<exclusion>xml-apis</exclusion>` | | 仅出现在内容辅助(Content Assist) | 重置代码提示设置:`Window > Preferences > Java > Editor > Content Assist` | --- ### **高级诊断方法** #### **类加载追踪** 在`eclipse.ini`中添加调试参数: ```ini -Dosgi.debug=true -Dosgi.framework.extensions=debug ``` #### **线程堆栈分析** 1. 当错误重现时,通过`jstack`获取线程快照: ```bash jstack -l <eclipse_pid> > thread_dump.txt ``` 2. 搜索`FilterProcessor`相关线程状态 --- ### **紧急恢复方案** 若问题持续存在,可尝试: ```text 1. 备份workspace后创建全新工作空间 2. 使用Eclipse Marketplace Client重装HANA插件 3. 在SAP Note 2783625中下载最新补丁 ``` 建议通过 **SAP Support Portal** 提交以下信息获取官方支持: 1. 完整的`.log`文件(位于workspace/.metadata) 2. 出错的HANA插件版本号 3. 操作系统和JDK版本(`java -version`输出)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值