内存泄漏

Android内存泄漏分析实战

怎甘沉沦 提交于 2019-12-02 08:53:04
内存泄漏简介 java可以保证当没有引用指向对象的时候,对象会被垃圾回收器回收,与c语言自己申请的内存自己释放相比,java程序员轻松了很多,但是并不代表java程序员不用担心内存泄漏。当java程序发生内存泄漏的时候往往具有隐蔽性。因此要借助一些 专业的平台资源 去保证安全性,例如可以通过 加密实现 。 定义 引用百度百科的定义:“用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束”。 从程序猿的角度来看“内存泄漏”,其实就是一个对象的生命周期超出了程序员所预期的长度(就叫它“该死不死”吧!),那么这个对象就泄漏了。 android开发中的内存泄漏 android应用程序本身系统分配的内存很少,一旦发生泄漏,程序很快就会变得非常卡顿,直至 OOM崩溃 。接下来将通过一个案例(只是为了分析内存泄漏而设计的玩具程序,切勿模仿)来介绍内存泄漏分析工具MAT,以及内存分析的技巧。 公欲善其事,先利其器 准备内存泄漏的分析工具,可以安装eclipse插件mat。如果eclise安装mat不成功,那可能是缺少必要的libs,如果嫌找库麻烦,可以只勾选第二项安装,不过会缺少某些功能,但是也够用了。 在线安装: http://download.eclipse.org/mat/1.4/update-site/ 下载安装: http://mirror

C/C++代码静态分析工具调研

那年仲夏 提交于 2019-12-02 03:54:42
C/C++代码静态分析工具调研 摘自:https://www.jianshu.com/p/92886d979401 简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析评估的过程,是软件质量和软件安全保障的重要一环。它通过词法分析、语义分析、控制流分析、数据流分析等技术对代码逐行解析暴露问题,从而协助我们将许多在运行时才会暴露的棘手麻烦扼杀于摇篮之中。 典型问题示例 代码静态分析能够识别诸多类型的漏洞或缺陷,轻至警告级的「变量未使用」,重至错误级的各类bug,这里列举几种常见的、较严重的、可静态检测的问题。 ■ 缓冲区溢出 缓冲区溢出是指向缓冲区中存入超出其空间大小的数据量,导致多余的数据覆盖其他区域的合法数据,类似倒入容器中的水过多而导致溢出,流到它不该去的地方,造成不可预期的后果。从实践统计看,缓冲区溢出问题是软件中最普遍存在的漏洞问题,在C/C++这类不提供内存越界检测的语言中尤甚。通常,发生缓冲区溢出的情况有: 字符串拷贝,当目标缓冲区长度小于源字串的长度时(此类的函数包括 strcpy 、 _mbscpy 、 strcat 、 wcscat 、 memcpy 、 strncpy 、 _mbsncpy 、 strncat 、 wcsncat 等)。 // 字符串拷贝之前没有对s做长度判断,如果超过10,就会造成缓冲区溢出。 void func

HTTP/2和Python的支持现状-2019-10

寵の児 提交于 2019-12-02 00:43:50
背景: 大概2019年9月份,天猫全面升级了HTTP/2的支持,并且加强了HTTP/1的访问限制,也可能很早前就这么做了, 但之前一直没限制HTTP/1的访问。之所以发现这个问题,是因为写的爬虫突然失败率奇高,而且是间断性被封禁。当 被封禁的时候,使用Chrome浏览器报错为:ERR_SPDY_PROTOCOL_ERROR。休息个不到一分钟,就又可以正常访 问。 于是开始分别使用HTTP/2和HTTP/1来测试,发现HTTP/2的爬取顺畅无比,HTTP/1几下就挂了。 原因搞清楚了,下面该是解决问题的时候了。 爬虫下载使用了Python的requests库,google一番发现requests并不支持HTTP/2。可能大神很忙,没工夫 维护了。 于是再次使用google大法,找到了hyper库,一个纯Python的HTTP/2客户端。 https://github.com/python-hyper/hyper 官方文档: https://hyper.readthedocs.io/en/latest/ 本来用惯了requests,突然换hyper感觉不太适应,没想到作者很贴心的提供了requests的支持: Requests Integration 。 先赞一个!!! 本以为问题到此结束,代码小改一下就完事,没想到的是,前 方 还 有 很 多 坑。。。 第一个坑(不支持代理):

线程封闭之栈封闭和ThreadLocal

[亡魂溺海] 提交于 2019-12-02 00:28:40
线程封闭   在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式。  1、栈封闭   所谓的栈封闭其实就是使用局部变量存放资源,我们知道局部变量在内存中是存放在虚拟机栈中,而栈又是每个线程私有独立的,所以这样可以保证线程的安全。  2、ThreadLocal   我们先看ThreadLocal和线程Thread的关系图。      再看下ThreadLocal的操作,以get为例 public T get() { // 当前线程 Thread t = Thread.currentThread();    // 拿到当前线程的threadLocalMap,即上图中的map引用 ThreadLocalMap map = getMap(t); if (map != null) { // 拿到当前ThreadLocal为Key对应的Entry,里面做了防止内存泄漏的处理 ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } // 如果为null设置默认值 return

Jprofile使用随笔_2_内存泄漏

南笙酒味 提交于 2019-12-01 20:02:03
上一篇写了安装以及windows监听服务器。这一篇写如何查看jvm有无内存泄漏。 内存泄漏:是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 使用一个Jprofile自带的例子:Animated Bezier Curve Demo。 如图:这个自带的例子,是一个二维图形的demo,这个demo有三个复选框,分别是内存泄漏、模拟阻塞、模拟长时间运行。本文分析内存泄漏,所以勾选“Leak Memory”。 1.先进入【Live Memory】-【Recorded Objects】,点击顶部菜单栏中的【Recorder Memory】,开始记录;此时点击【Mark Current】,以便于之后的与变化做对比。 2.多次手动GC,查看哪个类的增量不减少,一直增加,如图: 3.以java.lang.long为例,右键-在堆遍历中查看该类是哪个地方导致了内存泄漏,查看References-Incoming references 4.继上一步,右键点击查看: 内存泄漏发现到根源,至此结束。 jvm...太难了,老老实实记笔记 来源: https://www.cnblogs.com/jinziguang/p/11715749.html

Java中的内存泄露 和 JVM GC(垃圾回收机制)

南楼画角 提交于 2019-12-01 11:32:59
一、什么是Java中的内存泄露?   在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,   首先,这些对象是 可达的 ,即在有向图中, 存在通路可以与其相连 ;其次,这些对象是 无用的 , 即程序以后不会再使用这些对象 。   如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。   在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。    在Java中,这些不可达的对象都由GC负责回收 ,因此程序员不需要考虑这部分的内存泄露。   通过分析,我们得知,对于C++,程序员需要自己管理边和顶点,而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。   通过这种方式,Java提高了编程的效率。 来源: https://www.cnblogs.com/mww-NOTCOPY/p/11683303.html

[Android]App 内存泄漏检查工具MAT

北战南征 提交于 2019-12-01 05:13:12
Android App发生内存泄漏,常见的有Bitmap 使用后沒有recycle(),Drawable 使用后沒有setCallback(null)等。 Eclipse 有个插件工具MAT(Memory Analyzer Tool)可以帮助定位内存泄漏的对象。 安装MAT Update site: http://archive.eclipse.org/mat/1.1/update-site/ 用DDMS工具Dump出问题App的.hprof文件 比如com.world.test2.hprof Dump之前最好先运行一下GC "Cause GC" , 确保dump出来的是还不能回收的对象等。 用SDK tools下工具hprof-conv.exe 做转换 hprof-conv com.world.test2.hprof appleak.hprof 用Eclipse “Open Head Dump”打开新转换的.hprof 文件--appleak.hprof 查看图形化界面,一个一个检查怀疑的点。 总结: MAT tool不会直接告诉你哪里内存泄漏,但是会列出怀疑的对象,需要你仔细检查这些对象为什么没有被释放掉。 下面是测试code, 在Android 4.2.2上测试过。 此种情况可以引起Activity无法回收的情况,因为直接用类似private static Activity

Leakcanary原理浅析

烈酒焚心 提交于 2019-12-01 04:56:15
LeakCanary是Android内存泄漏的框架,作为一个“面试常见问题”它一定有值得学习的地方,今天就好好学习一下它。作为一名开发,我觉得给人讲框架或者库的原理,最好先把大概思路给读者讲一下,这样读者后面理解会按照这个框架往里填内容,理解起来也更容易一些,所以我先把LeakCanary的大致原理放出来: 其思路大致为:监听Activity生命周期->onDestroy以后延迟5秒判断Activity有没有被回收->如果没有回收,调用GC,再此判断是否回收,如果还没回收,则内存泄露了,反之,没有泄露。 下面开始按这个思路分析源码,直接从入口开始: public static RefWatcher install(Application application) { return refWatcher(application).listenerServiceClass(DisplayLeakService.class) .excludedRefs(AndroidExcludedRefs.createAppDefaults().build()) .buildAndInstall(); } builder模式构建了一个RefWatcher对象, listenerServiceClass() 方法绑定了一个后台服务 DisplayLeakService

有关内存溢出和内存泄漏的知识点

拟墨画扇 提交于 2019-12-01 02:26:44
在 jvm 中,有关内存可能会出现的两种错误内存溢出和内存泄漏,怎么理解这两种错误: 1 、内存泄漏 memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 2 、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。 3 、二者的关系 内存泄漏的堆积最终会导致内存溢出 内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。 内存溢出:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢

内存泄漏的原因及解决

巧了我就是萌 提交于 2019-11-30 22:50:41
转自: https://my.oschina.net/hiease/blog/1613871 虽然jvm有垃圾回收机制,如果程序编写不注意某些特定规则,仍然会导致java程序内存泄漏,最终可能出现OutOfMemory异常。 1.Java内存泄漏的原因 java中的对象从使用上分为2种类型,被引用(referenced)的和不被引用(unreferenced)的。垃圾回收只会回收不被引用的对象。被引用的对象,即使已经不再使用了,也不会被回收。因此如果程序中有大量的被引用的无用对象时,就是出现内存泄漏。 2.java堆内存(Heap)泄漏 jvm堆内存的大小是通过 -Xms 和 -Xmx两个参数指定的。 2.1 对象被静态成员引用 当大对象被静态成员引用时,会造成内存泄漏。 示例: private Random random = new Random(); public static final ArrayList<Double> list = new ArrayList<Double>(1000000); for (int i = 0; i < 1000000; i++) { list.add(random.nextDouble()); } ArrayList是在堆上动态分配的对象,正常情况下使用完毕后,会被gc回收,但是在此示例中,由于被静态成员list引用