Grow heap (frag case) 堆内存过大的深入解析
对于Android开发者来说虽然使用了可以自动管理内存的Java语言,但是对于内存管理不当,可能你的应用不断出现类似INFO/dalvikvm-heap(10798): Grow heap (frag case) to 6.437MB for 1114126-byte allocation,而出现的
Grow heap 后面的值不断增加,接下来轻微则Android系统开始结束后台任务来增加不断增加的堆内存问题,最后可能直接出现OOM,同时有时候GC还可能出现GC freed 0 objects / 0 bytes in 75ms这样的问题,对于Java的内存管理我们近期已经说到了,就上面这些问题Android123给大家做一个简单的分析。
1. 这里Grow heap (frag case) to 6.437MB for 1114126-byte allocation表示你一直在分配一个较大的对象,占用的堆内存达到了6.4MB。
2. 为什么会出现这样的问题,经过询问表示是因为分配了一个byte[]数组,需要以Blob方式写入SQLite数据库,而造成的这么大的单个对象出现,这里Android开发网提醒大家,这是很危险的操作,对于不同固件和低RAM配置的设备随时都有OOM的危险,如果你真的需要往SQLite存储二进制,这里可以采用分段的方式,将某个对象拆分为1MB或更小,分更多的段来存放,中间加一层拆分数据缓存层来解决比较好。
3. 同时每次构造单个较大对象前,可以通知gc准备收集,比如在执行需要耗操作前执行System.gc(); 防止OutOfMemoryError的发生,对于Java的内存溢出问题,今后我们会通过各种案例来讲解。
相关推荐
-
Grow heap (frag case) 堆内存过大的深入解析
对于Android开发者来说虽然使用了可以自动管理内存的Java语言,但是对于内存管理不当,可能你的应用不断出现类似INFO/dalvikvm-heap(10798): Grow heap (frag case) to 6.437MB for 1114126-byte allocation,而出现的Grow heap 后面的值不断增加,接下来轻微则Android系统开始结束后台任务来增加不断增加的堆内存问题,最后可能直接出现OOM,同时有时候GC还可能出现GC freed 0 objects /
-
基于Java堆内存的10个要点的总结分析
Java堆内存的10个要点 .javaoutofmemoryerrorgenerationjvmprofiler编程当我开始学习Java编程时,我不知道什么是堆内存或堆空间,我甚至不知道当对象创建时,它们被放在了哪里.当我开始正式写一些程序后,我会经常遇到java.lang.outOfMemoryError的报错,之后我才开始关注什么是堆内存或者说堆空间(heap space).对大多数程序员都经历过这样的过程,因为学习一种语言是非常容易来的,但是学习基础是非常难的,因为没有什么特定的流程让你学
-
一文教会你使用jmap和MAT进行堆内存溢出分析
jmap:Java内存映像工具 jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件).另外,还有几种方式获取dump文件:使用JVM参数选项-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX:HeapDumpPath=path 设置dump文件路径(有时候dump文件比较大的时候可能无法自动导出,这时候就需要使用jmap -dump手动导出了):通过-X
-
Java8内存模型PermGen Metaspace实例解析
一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫"栈帧"的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用).操作数栈.方法出口等信息.栈的大小可以固定也可以动态扩展.当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误,不过这个深度范围不是一个恒定的值,我们通过下面这段程序可以测
-
Java 堆内存与栈内存详细介绍
Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取
-
简述JAVA中堆内存与栈内存的区别
Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则. 栈内存在函数中定义的"一些基本类型的变量和对象的引用变量"都在函数的栈内存中分配.当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用. Java中的代码是在函数体中执行的,每个函数主体都会被放在栈内存中,比如main函数.假如ma
-
详解C标准库堆内存函数
概述 C标准库堆内存函数有4个:malloc.free.calloc.realloc,其函数声明放在了#include <stdlib.h>中,主要用来申请和释放堆内存. 堆内存的申请和释放(wiki,chs),需要发起系统调用,会带来昂贵的上下文切换(用户态切换到内核态),十分耗时.另外,这些过程可能是带锁的,难以并行化. 对于操作系统而言,内存管理的基本单位是页(通常为4K),而不是需要4 Bytes时,就给你分配4 Bytes,释放4 Bytes时,就给你释放4 Bytes. 因此,为了
-
教你用MAT工具分析Java堆内存泄漏问题的解决方法
一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版,可以直接解压使用. 我把独立版MAT安装包放到了网盘上,方便直接下载 链接: https://pan.baidu.com/s/1DVHlHuSfi_4TVl2ei5YuLA 提取码: 42qt 独立版解压后,其内部文件是这样的-- 这里有一个MemoryAnalyzer.in
-
JVM中堆内存和栈内存的区别
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中
-
详解Java的堆内存与栈内存的存储机制
堆与内存优化 今天测了一个项目的数据自动整理功能,对数据库中几万条记录及图片进行整理操作,运行接近到最后,爆出了java.lang.outOfMemoryError,java heap space方面的错误,以前写程序很少遇到这种内存上的错误,因为java有垃圾回收器机制,就一直没太关注.今天上网找了点资料,在此基础上做了个整理. 一.堆和栈 堆-用new建立,垃圾回收器负责回收 1.程序开始运行时,JVM从OS获取一些内存,部分是堆内存.堆内存通常在存储地址的底层,向上排列. 2.堆
随机推荐
- Springmvc ajax跨域请求处理方法实例详解
- 在Django框架中自定义模板过滤器的方法
- 详解vue事件对象、冒泡、阻止默认行为
- jsp页面中表达式语言中的$符号不起作用的解决方法
- JAVA操作XML实例分析
- Java 反射之私有字段和方法详细介绍
- ajax请求返回的数据看不到回调函数没有执行也没报错
- C++实现十六进制字符串转换为十进制整数的方法
- Android进阶篇-自定义图片伸缩控件具体实例
- php PATH_SEPARATOR判断当前服务器系统类型实例
- Python编写检测数据库SA用户的方法
- DataGridView带图标的单元格实现代码
- Javascript 倒计时源代码.(时.分.秒) 详细注释版
- shell常用重定向实例讲解
- 使用有趣的自定义标记布局页面
- js 创建对象 经典模式全面了解
- Lua中让回调函数支持回调对象方法的解决方法
- Redis 命令整理并说明如何使用
- js的匿名函数使用介绍
- Android GridView实现动画效果实现代码