内存泄漏3____内存泄漏, 内存溢出的区别与关系__内存抖动

2023-11-17

泄漏  memory leak  是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,
但内存泄漏堆积后, 会变得很严重,无论有多少空间,迟早会被占光。

memory leak 最终会导致 OOM (out of memory)。 看一个图


一. 溢出  out of  memory  是指程序在申请内存空间时, 没有足够的空间供其使用,出现OOM, 比如申请了1M的图片空间,但它要存一个5M大小的图片,就是内存溢出。
 

分析: 垃圾回收就是一种自动在堆内存中找出哪些对象在被使用, 哪些对象没被使用,并且将没被使用的删掉的机制。

注意:JVM有GC机制, C++才需要手动回收。

二. 接下来了解 内存抖动

短时间内有大量对象创建销毁导致,它会伴随着频繁的GC.

我们在AS上运行Android工程时,点击Profile 'app' 按钮,可以看到很多系统配置信息

, 点击后,可看到下方如图所示

内存抖动可以用 如下图所示:  图表跳动很强烈

2.1 内存抖动的影响: 卡顿

2.2  内存抖动的影响:OOM

应用的GC运行时,会将程序所有线程挂起,因为一边在回收垃圾,一边在产生垃圾, 会导致回收还没有产生快,垃圾越来越多。

看一个图,形象表示内存使用情况:

2.3 内存抖动 的原因有:

1. 字符串的拼接, 例如

for(int i=0;i<values.length;i++){
            /**
             * 使用+号, 看起来是修改了值,其实是把变量指向的内存区域,指向的对象发生了变化
             * 而对于字符串本身是不变的, +号是做了StringBuilder()的append()方法
             */
            result +=values[i];
            //以下写法与 上句效果相同,  但是会创建大量临时对象
            //result = new StringBuilder().append(result).append(values[i]).toString();

            // 第三步,通过javap  -c com.rd.memory.TestMemory 命令行来查看class文件的指令
}

2. 有的方法会创建新的对象,例如 Color.parseColor()方法, 会创建一个新的String对象。

    此方法 如果是放在循环调用里(如onDraw()),将导致产生很多String对象。 

解决方法: 用 paint.setColor(colorInts[i]) 代替 paint.setColor(Color.parseColor(color[i])), 

也就是说传递 int类型数组的参数,  不是字符串数组再转化的参数

3. 内存抖动的根本原因是 创建大量的临时对象, 这些对象用完一次就不要了, 最常见是在 for循环中 创建String对象。

   不是说创建大量对象就一定会内存抖动。 

4. 看一个例子,

public class TestMemory {


    public static void main(String[] args) {
        addStr(new String[]{"cpu", "memory", "network"});
    }

    public static String addStr(String[] values){
        //字符串定义了值,是不可变的
        String result = "";
        for(int i=0;i<values.length;i++){
            /**
             * 使用+号, 看起来是修改了值,其实是把变量指向的内存区域,指向的对象发生了变化
             * 而对于字符串本身是不变的, +号是做了StringBuilder()的append()方法
             */
            result +=values[i];
            //以下写法与 上句效果相同,  但是会创建大量临时对象
            //result = new StringBuilder().append(result).append(values[i]).toString();

            // 第三步,通过javap  -c com.rd.memory.TestMemory 命令行来查看class文件的指令
        }
        return result;
    }
}

用 javap 执行如下命令,可以看到TestMemory执行的指令过程

在profile界面中, 点击Record按钮,开始记录一段时间应用的内存情况

内存泄漏是造成内存溢出的主要原因之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存泄漏3____内存泄漏, 内存溢出的区别与关系__内存抖动 的相关文章

随机推荐

  • 对矩阵的处理 MATLAB

    矩阵 1 创建矩阵 1 直接输入法s 1 1 2 2 3 3 4 4 结果如图 2 利用某些函数zeros或ones创建 3 复数矩阵 直接按照直接输入法来建立矩阵 但是元素可以直接打成复数的形式 a bj 2 还有就是分别建立一个实部还有
  • Android mob(sharesdk)微信分享/微信朋友圈分享/QQ分享/QQ空间分享/新浪微博分享(自定义)

    使用场景 H5混合开发转Android 原生开发 之前也是用的友盟分享 微信原生 QQ原生 微博原生分享 今天这个项目恰好是用的mob的sharesdk分享 老实说 还是第一次使用 一开始接手项目的时候 还以为mob是个后台 来一张效果图
  • pandorabox php7,新路由3newifi D2专用潘多拉PandoraBox固件SFE快速转发超强信号不掉速eeprom...

    今天就分享一个这次给新路由3 newifi3 PandoraBox 潘多拉固件下载刷的第三方固件潘多拉PandoraBox固件 PandoraBox是什么 PandoraBox 是基于LEDE OpenWrt框架高度定制的中文本地化固件 应
  • HTML语言中vw的用法,CSS中如何使用视窗单位

    视窗 Viewport 单位已经有了好几年了 但我们并没有看到它被经常使用 它们现在正在被所有的主流浏览器所支持并提供独特的功能使它在特定情况下非常有用 特别是那些涉及响应式的设计 介绍视窗 Viewport 单位 视窗 Viewport
  • arouter 自定生成autowired

    原文地址 Evil Mouth s Blog ARouter Autowired 自动注入 May 31 2020 前言 ARouter 有一个 Autowired 的注解 能自动帮我们赋值一些变量 例如 public class Main
  • HBase 维护--查看HLog和HFile

    查看HLog 看了一些文章 HBase高可靠性是实现了HLog Write ahead Log 机制 那么HLog到底存在哪里了呢 首先去HDFS的 hbase目录查看一下 hadoop fs ls R hbase 可以看到hbase下面有
  • MariaDB数据库服务器

    目录 一 什么是数据库 二 什么是关系型数据库 三 数据库字符集和排序规则是什么 四 常用数据类型 五 Mariadb数据库相关配置案例 一 什么是数据库 数据库 DB 是以一定方式长期存储在计算机硬盘内 能与多个用户共享 具有尽可能小的冗
  • android 自动获取短信,安卓app怎样获取短信验证码自动输入

    这个你要自己写吗 我建议你直接调用短信平台的接口不就可以了吗 短信发送 接口地址 String url http 183 203 28 5 9000 HttpSmsMt 下发时间 String mttime new SimpleDateFo
  • [翻译] ProtoBuf 官方文档(全)

    ProtoBuf CSDN搜索 https so csdn net so search q ProtoBuf t blog u chuifuhuo6864
  • nginx重启命令

    nginx s reload 修改配置后重新加载生效 nginx s reopen 重新打开日志文件 nginx t c path to nginx conf 测试nginx配置文件是否正确 关闭nginx nginx s stop 快速停
  • 解决在Anaconda下安装tensorflow报错的问题 ModuleNotFoundError: No module named ‘tensorflow‘

    解决在Anaconda下安装tensorflow报错的问题 Traceback most recent call last File line 1 in ModuleNotFoundError No module named tensorf
  • 宽字节注入入门详解

    原理 GBK 占用两字节 ASCII占用一字节 PHP中编码为GBK 函数执行添加的是ASCII编码 添加的符号为 MYSQL默认字符集是GBK等宽字节字符集 大家都知道 df 被PHP转义 开启GPC 用addslashes函数 或者ic
  • 第二章-注入漏洞

    第二章 注入漏洞 第一节 SQL注入原理 1 1 SQL注入的原因 语言分类 解释型语言和编译型语言 解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言 而编译型语言是代码在生成时转换为机器指令 然后在运行时直接
  • uniapp弹幕滚动到底部

    发布的弹幕至于最底部
  • 【linux】linux 离线安装 curl命令

    文章目录 1 概述 2 curl安装步骤 3 验证 原创不易 且行且珍惜 1 概述 最近在忙一个艰苦的环境 没有yarn界面 没有flink界面 没有es界面 没有kibana界面 条件艰苦 且行且艰险 这个环境发现es日志不入库 然后查看
  • 内网渗透工具-反向代理FRP

    内网渗透工具 反向代理FRP 0x1 简介 FRP是一个比较流行而且成熟的内网渗透工具 支持 TCP UDP HTTP HTTPS 等多种协议 0x2 前期准备 工具准备 可在官方github仓库下载 https github com fa
  • ‘mvn‘不是内部或外部命令

    解决方案有两种 一 1 如果没有安装maven 在IDEA中使用maven 提示mvn不是内部命令 需要在环境变量中的用户变量的Path中添加maven的bin路径 重启下IDEA即可 1 环境变量 用户 2 Path 添加IDEA下的ma
  • Pytorch框架下训练网络的代码结构

    PyTorch 是一个基于 Torch 的 Python 开源机器学习库 用于自然语言处理等应用程序 它主要由 Facebook 的人工智能研究小组开发 PyTorch 提供两个高级功能 1 具有强大的 GPU 加速的张量计算 如 NumP
  • TCP/IP网络编程(6)

    1 IO复用 并发服务器的实现方法 在网络程序中 数据通信时间比CPU运算时间占比更大 因此 采用并发的形式向多个客户端提供服务是一种有效利用CPU的方式 并发服务器的主要实现模型及方法如下所示 多进程服务器 通过常见多个进程提供服务 多路
  • 内存泄漏3____内存泄漏, 内存溢出的区别与关系__内存抖动

    泄漏 memory leak 是指程序在申请内存后 无法释放已申请的内存空间 一次内存泄露危害可以忽略 但内存泄漏堆积后 会变得很严重 无论有多少空间 迟早会被占光 memory leak 最终会导致 OOM out of memory 看