在某个项目组通过eclipse打包模块项目时频繁出现内存溢出问题,项目组采用32位win7操作系统,内存4G,单看机器配置已经算是高配了,在eclipse.ini中将PermSize调到很大仍然报错。 报错信息显示不能创建本地线程native thread。通过两种方法解决了问题:
1、调整ini文件中的jvm内存参数。
调整的关键为:
MaxPermSize 与 PermSize值相等
Xms 与 Xmx值相等
2、调整打包代码。
跟踪调试发现打包内存溢出的触发点为:导出插件项目时,会生成build.xml文件,其中target中大量使用unzip命令,该命令会调用操作系统的native method方法,如果jvm参数中设置的堆+Perm区和Native空间不平衡就很容易报内存溢出问题。
<target name="@dot.nestedJars"> <mkdir dir="${buildDirectory}/nestedJars/com.sgcc.uap.integrate.isc_1.5.1.v201308131540"/> <unzip src="I:/UAP Studio1.5.1/sguap-server/WEB-INF/repository/platform/Version1.0.0/infrastructure/com.sgcc.uap.integrate.isc_1.5.1.v201308131540.jar" dest="${buildDirectory}/nestedJars/com.sgcc.uap.integrate.isc_1.5.1.v201308131540" overwrite="false"> <patternset includes="lib/isc_sso_agent.jar"/> </unzip> 。。。。。。。。 </target> <target name="@dot" depends="init,@dot.nestedJars" unless="@dot" description="Create jar: mpm_sinprjpre_pm @dot.">
通过给项目组编写手工build.xml脚本发现,javac编译时,classpath中没有unzip出的lib包也没有问题,于是修改了生成build.xml文件的类,将unzip的target以及对其的依赖删除。修改的类为org.eclipse.pde.build插件中pdebuiler.jar内的ModelBuildScriptGenerator类的generateExtractNestedJars方法和generateCompilationTarget方法。
private List generateExtractNestedJars(List classpath, CompiledEntry entry) { List extracted = new ArrayList(classpath.size()); for (Iterator iterator = classpath.iterator(); iterator.hasNext();) { ClasspathElement element = (ClasspathElement) iterator.next(); if (element.getSubPath() == null) extracted.add(element); } return extracted; } private void generateCompilationTarget(List classpath, CompiledEntry entry) { script.println(); String name = entry.getName(false); List extractedPath = generateExtractNestedJars(classpath, entry); // String depends = TARGET_INIT + "," + name + TARGET_NESTED_JARS; String depends = TARGET_INIT; //$NON-NLS-1$ IStatus status=new Status(IStatus.INFO, "org.eclipse.pde.build", "generateCompilationTarget方法depends:"+depends); BundleHelper.getDefault().getLog().log(status);
评论