Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

图片查重作业报告 #2

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

20020263
Copy link

极客时间账号: 13580790013

为了完成这个作业,拉了LeakCanary源码下来看了下内存泄漏检测的二次GC确认到解析hprof文件数据生成对象的引用链信息等,其中也用到了HAHA库,我这里的DEMO代码页也是使用的HAHA库的解析方法

这里说说我的实现原理:

  • 预备一个已经存在重复bitmap的hprof文件
  • 利用HAHA库上的MemoryMappedFileBuffer读取hrpof文件 [关键代码 new MemoryMappedFileBuffer(heapDumpFile) ]
  • 解析生成snapshot,获取heap,这里我只获取了app heap [关键代码 snapshot.getHeaps(); heap.getName().equals("app") ]
  • 从snapshot中根据指定class查找出所有的Classes [关键代码snapshot.findClasses(Bitmap.class.getName()) ]
  • 从heap中获得所有的Bitmap实例instance [关键代码 clazz.getHeapInstances(heap.getId()) ]
  • 根据instance中获取所有的属性信息Field[]
  • 从Field[]查找出我们需要的"mWidth" "mHeight" "mBuffer"信息
  • 通过"mBuffer"属性即可获取他们的hashcode来判断相同
  • 最后通过instance中mNextInstanceToGcRoot获取整个引用链信息并打印

体会:
一直性能优化和检测经验方面比较薄弱,为了完成这个作业,
接连对android profiler、DDMS、MAT、LeakCanary、还有复现图片的GIMP都翻了个遍
会发现其中涉及到的东西太多太多,为了验证实现结果,也重复学习使用现有的工具多方求证

疑问:

  • 在实际应用中,除了实现对图片的重复检测还有什么有代表性的检测实现呢
  • 如果是想初步形成一个自动化分析,应该怎么跟当前项目结合比较适合,在哪些时机场景使用自动化分析意义价值较大(因为在开发阶段已经有LeakCanary实时提示一些内存泄漏问题)
  • 对上面的问题,想老师在项目构建编译、代码检测这方面结合自动化分析跟点经验和思路

最后送上测试打印结果
image

@laiyi55
Copy link

laiyi55 commented Dec 16, 2018

最后一条是不是打印了两遍?有什么特殊含义吗?

@20020263
Copy link
Author

最后一条是不是打印了两遍?有什么特殊含义吗?

我这里是模仿了生成有三个相同的 bitmap创建,由于截图长度问题没有打印第三个出来而已

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants