Android:java.lang.OutOfMemoryError的问题解决方案

解决Android 内存溢出

你可以添加在你的清单配置文件中添加

android:hardwareAccelerated="false"
android:largeHeap="true"

例如:

  1. <application

  2. android:allowBackup="true"

  3. android:hardwareAccelerated="false"

  4. android:icon="@mipmap/ic_launcher"

  5. android:label="@string/app_name"

  6. android:largeHeap="true"

  7. android:supportsRtl="true"

  8. android:theme="@style/AppTheme">

 

从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.硬加速使用GPU承担了所有在View的canvas上执行的绘制操作.

  启用硬加速最简单的的方法是对整个应用启用硬件速.如果你的应用只使用标准的view和Drawable,全局启用硬加速将不会带来任何负面影响.然而,因为硬加速不是被所有的2D绘制所支持,所以启用它时可能对你的自定义绘制产生影响.出现的问题经常是不可见的,也可能是异常,或错误地显示了像素.为了避免这些问题,Android提供了在以下各级别上启用或禁止硬加速的能力:

Application

Activity

Window

View

  如果你的应用使用了自定义绘制,需要在真实的设备上启用硬加速进行测试来找出问题."不支持的绘制操作"一节描述了已知的不能被硬加速的绘制操作以及如何避开它们.

 

 

控制硬加速

  你可以在以下级别上分别控制硬加速:

Application

Activity

Window

View

 

Application级   在你的manifest文件中,把以下属性添加到<application>标签来对你的整个应用启用硬加速:

<applicationandroid:hardwareAccelerated="true" ...>

Activity级   如果你的应用在全局启用硬加速时行为不正确,你可以对个别activities单独启用硬加速.欲在actvity级别启用或禁止硬加速,你可以对<activity>元素使用android:hardwareAccelerated属性.下面的例子在整个应用中启用了硬加速但对一个activity禁止了硬加速:

<applicationandroid:hardwareAccelerated="true">

<activity... />

<activityandroid:hardwareAccelerated="false" />

</application>

Window级   如果你需要更高颗粒度的控制,你可以使用以下代码为一个window启用硬加速:

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

 

 

注:现在你还不能在window级别禁止硬加速.

 

Viewlevel

你可以在运行时使用以下代码禁止个别的View的硬加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

 

注:当前你不能在View级别启用硬加速.View层有除禁止硬加速之外的其它功能.

 

 

判定一个View是否能被硬加速

  有时一个应用了解是否启用了硬件速是很有用的,对那些自定义View之类的东西尤其重要.在你的应用做了一些不被最新的管线所支持的自定义绘制时这更加重要.

 

  有两种方法可以检查应用是否被硬加速:

View.isHardwareAccelerated():如果View附加到一个硬加速的window上就返回true.

Canvas.isHardwareAccelerated():如果Canvas被硬加速了就返回true.

 

  如果你必须在你的绘制代码中做这个,应使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().当一个view附加到一个硬加速的window上,它仍可以使用非硬件速的Canvas进行绘制操作.比如当为了高速缓存而把一个view画到一个bitmap中.

### Android Studio 中 `java.lang.OutOfMemoryError: Java heap space` 错误解决方案 当遇到 `java.lang.OutOfMemoryError: Java heap space` 错误时,表明当前分配给 JVM 的堆内存不足以支持正在执行的任务。对于 Android Studio 用户而言,可以通过调整 Gradle 和 IDE 自身的 JVM 参数来解决问题。 #### 修改 Gradle 配置文件以增加堆内存 为了提高构建过程中的性能并防止因内存不足引发的错误,在项目的根目录下找到或创建名为 `gradle.properties` 的文件,并加入如下配置: ```properties org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 ``` 上述命令通过 `-Xmx2048m` 设置最大堆大小为 2GB;`-XX:MaxPermSize=512m` 设定永久代的最大容量为 512MB;启用 `-XX:+HeapDumpOnOutOfMemoryError` 可在发生 OOM 后自动生成转储文件以便后续分析;最后指定字符编码方式为 UTF-8[^2]。 #### 调整 Android Studio 的 JVM 参数 除了修改 Gradle 属性外,还可以优化 Android Studio 运行环境下的 JVM 行为。前往安装路径下的 bin 文件夹内编辑 studio.vmoptions 或者 studio64.vmoptions (取决于操作系统架构),添加以下参数: ```bash -Xms1024m -Xmx3072m -XX:ReservedCodeCacheSize=512m -XX:+UseCompressedOops ``` 这里设置了最小堆尺寸 (`-Xms`) 至少有 1 GB ,并将最大值提升到 3 GB 。同时增加了预留代码缓存区(`-XX:ReservedCodeCacheSize`)至 512 MB 并启用了压缩指针功能(`-XX:+UseCompressedOops`) 来进一步节省内存开销[^4]。 #### 应用层面优化建议 尽管适当扩展 JVM 堆空间能够缓解短期问题,但从长远来看还是应该考虑如何减少应用本身对资源的需求量。例如定期触发 GC 收集不再使用的对象实例、合理控制加载的数据规模以及采用分页机制处理大数据集合等措施均有助于降低整体消耗水平[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值