转自:http://hi.baidu.com/windy1123/blog/item/87b9b638d588372271cf6c32.html

今天在在编译android工程时遇到 Unable to execute dex: Java heap space的问题,现在分享一下解决方案



上网找了一下,有两种解决方案:

1. eclipse.int 添加内存

2. 导入工程的jar通过add User Library方式导入

右键工程->build path->add Library->user Library->user Libraries->new->随便取个名字->add JARs->ok

添加过程中记得将user systemLibrary选中



其中第一种方法我已经尝试将在eclipse.ini中将

--launcher.XXMaxPermSize

512m(这个修改要参考自己机器的物理内存大小),下面会附上eclipse.ini中参数的含义;

重点说一下第二种:

开始按照网上说的正确Add User Library and set as User system Library,同时根据项目的需要将不需要的关联library给去除

出现Unable to execute dex: Java heap space主要的原因是JVM加载jar包占用了大量的分配的内存



eclipse.ini



-startup

plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar

--launcher.library

plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519

-showsplash

org.eclipse.platform

--launcher.XXMaxPermSize

256m

-vmargs

-Xms40m

-Xmx256m

下面直接可以配置相关参数

参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。



堆(Heap)和非堆(Non-heap)内存

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



堆内存分配

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

非堆内存分配

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

JVM内存限制(最大值)

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

参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:



-vm

C:\Java\jre1.6.0\bin\javaw.exe

其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,区别就是前者是eclipse.exe启动的时候设置的参数,而后者是eclipse所使用的JVM中的参数。

更多相关文章

  1. android中的R中属性获取相关
  2. [android]动态查询手机内存
  3. java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  4. 安卓常用参数笔记
  5. Appium的简单使用(Android参数获取)
  6. android volley 调用webService
  7. Android(安卓)用纯代码实现复杂界面
  8. Android(安卓)利用getIdentifier()方法获取资源ID
  9. 在xml文件的Preference标签中,用给标签加参数

随机推荐

  1. 我的第一个 Mono for Android(安卓)应用
  2. Android(安卓)Camera(五)
  3. 安卓开发环境AS2.0搭建
  4. android adb shell 笔记
  5. android点击事件
  6. android的学习(一)环境搭建
  7. Android(安卓)AIDL 教程 (一)—— 简单的
  8. Android(java)学习笔记76:多线程-定时器概述
  9. 将LED驱动增加进内核的方法(Android_OK641
  10. Activity切换动画效果的修改