当前位置: 首页 > news >正文

公司网站要备案吗注册资金100万的公司要多少钱

公司网站要备案吗,注册资金100万的公司要多少钱,自己做网站推广,有没有可以做兼职的网站上一篇#xff1a;LeakCanary源码详解#xff08;2#xff09; 如果你是直接刷到这篇的#xff0c;建议还是从1开始看#xff0c;然后2#xff0c;然后是这篇3#xff0c;如果你只关注这篇的重点hprof 文件定位泄漏位置的感兴趣#xff0c;可以试试直接读这篇#xff…上一篇LeakCanary源码详解2 如果你是直接刷到这篇的建议还是从1开始看然后2然后是这篇3如果你只关注这篇的重点hprof 文件定位泄漏位置的感兴趣可以试试直接读这篇如果中间没发觉有难理解的就算了要是发觉无法理解了就建议从1 2篇读起经典的库的代码没那么简单不要害怕花时间。 这篇要说一下hprof解析的下图中是dumpHeap反复中有两次sendEvent 我们看一下里面 eventListeners里面的RemoteWorkManagerHeapAnalyzer就是分析hprof的类 然后就是RemoteHeapAnalyzerWorker 核心就是AndroidDebugHeapAnalyzer.runAnalysisBlocking了 然后是analyzeheap()方法 里面是调用heapAnalyzer.analyze方法 又调用了类本身内部的analyze方法。 调用了helpers.analyzeGraph() 而在202309/24 新版本上是这图这样的结构变了逻辑一样分析 graph 2.2 Hprof 文件解析 解析入口 //HeapAnalyzerService private fun analyzeHeap( heapDumpFile: File, config: Config ): HeapAnalysis { val heapAnalyzer HeapAnalyzer(this) val proguardMappingReader try {//解析混淆文件ProguardMappingReader(assets.open(PROGUARD_MAPPING_FILE_NAME)) } catch (e: IOException) {null } //分析hprof文件 return heapAnalyzer.analyze(heapDumpFile heapDumpFile,leakingObjectFinder config.leakingObjectFinder,referenceMatchers config.referenceMatchers,computeRetainedHeapSize config.computeRetainedHeapSize,objectInspectors config.objectInspectors,metadataExtractor config.metadataExtractor,proguardMapping proguardMappingReader?.readProguardMapping() )} 关于Hprof文件的解析细节就需要牵扯到Hprof二进制文件协议 http://hg.openjdk.java.net/jdk6/jdk6/jdk/raw-file/tip/src/share/demo/jvmti/hprof/manual.html#mozTocId848088 通过阅读协议文档hprof的二进制文件结构大概如下 解析流程 fun analyze( heapDumpFile: File, leakingObjectFinder: LeakingObjectFinder, referenceMatchers: List emptyList(), computeRetainedHeapSize: Boolean false, objectInspectors: List emptyList(), metadataExtractor: MetadataExtractor MetadataExtractor.NO_OP, proguardMapping: ProguardMapping? null ): HeapAnalysis { val analysisStartNanoTime System.nanoTime() if (!heapDumpFile.exists()) { val exception IllegalArgumentException(“File does not exist: $heapDumpFile”) return HeapAnalysisFailure( heapDumpFile, System.currentTimeMillis(), since(analysisStartNanoTime), HeapAnalysisException(exception) ) } return try { listener.onAnalysisProgress(PARSING_HEAP_DUMP) Hprof.open(heapDumpFile) .use { hprof - val graph HprofHeapGraph.indexHprof(hprof, proguardMapping)//建立gragh val helpers FindLeakInput(graph, referenceMatchers, computeRetainedHeapSize, objectInspectors) helpers.analyzeGraph(//分析graph metadataExtractor, leakingObjectFinder, heapDumpFile, analysisStartNanoTime ) } } catch (exception: Throwable) { HeapAnalysisFailure( heapDumpFile, System.currentTimeMillis(), since(analysisStartNanoTime), HeapAnalysisException(exception) ) } } LeakCanary在建立对象实例Graph时主要解析以下几种tag 涉及到的GCRoot对象有以下几种 2.2.1 构建内存索引Graph内容索引 LeakCanary会根据Hprof文件构建一个HprofHeapGraph 对象该对象记录了以下成员变量 interface HeapGraph { val identifierByteSize: Int /** In memory store that can be used to store objects this [HeapGraph] instance. / val context: GraphContext /*All GC roots which type matches types known to this heap graph and which point to non nullreferences. You can retrieve the object that a GC Root points to by calling [findObjectById]with [GcRoot.id], however you need to first check that [objectExists] returns true becauseGC roots can point to objects that don’t exist in the heap dump. / val gcRoots: List /*Sequence of all objects in the heap dump.This sequence does not trigger any IO reads. */ val objects: Sequence //所有对象的序列包括类对象、实例对象、对象数组、原始类型数组 val classes: Sequence //类对象序列 val instances: Sequence //实例对象数组 val objectArrays: Sequence //对象数组序列 val primitiveArrays: Sequence //原始类型数组序列 } 为了方便快速定位到对应对象在hprof文件中的位置LeakCanary提供了内存索引HprofInMemoryIndex 建立字符串索引hprofStringCacheKey-valuekey是字符IDvalue是字符串 作用 可以根据类名查询到字符ID也可以根据字符ID查询到类名。 建立类名索引classNamesKey-valuekey是类对象IDvalue是类字符串ID 作用 根据类对象ID查询类字符串ID。 建立实例索引**instanceIndex**Key-valuekey是实例对象IDvalue是该对象在hprof文件中的位置以及类对象ID 作用 快速定位实例的所处位置方便解析实例字段的值。 建立类对象索引classIndexKey-valuekey是类对象IDvalue是其他字段的二进制组合父类ID、实例大小等等 作用 快速定位类对象的所处位置方便解析类字段类型。 建立对象数组索引objectArrayIndexKey-valuekey是类对象IDvalue是其他字段的二进制组合hprof文件位置等等 作用 快速定位对象数组的所处位置方便解析对象数组引用的对象。 建立原始数组索引primitiveArrayIndexKey-valuekey是类对象IDvalue是其他字段的二进制组合hprof文件位置、元素类型等等 2.2.2 找到泄漏的对象 1)由于需要检测的对象被 com.squareup.leakcanary.KeyedWeakReference 持有所以可以根据 com.squareup.leakcanary.KeyedWeakReference 类名查询到类对象ID 解析对应类的实例域找到字段名以及引用的对象ID即泄漏的对象ID 2.2.3找到最短的GCRoot引用链 根据解析到的GCRoot对象和泄露的对象在graph中搜索最短引用链这里采用的是广度优先遍历的算法进行搜索的 //PathFinder private fun State.findPathsFromGcRoots(): PathFindingResults { enqueueGcRoots()//1 val shortestPathsToLeakingObjects mutableListOfReferencePathNode() visitingQueue while (queuesNotEmpty) {val node poll()//2if (checkSeen(node)) {//2throw IllegalStateException(Node $node objectId${node.objectId} should not be enqueued when already visited or enqueued)}if (node.objectId in leakingObjectIds) {//3shortestPathsToLeakingObjects.add(node)// Found all refs, stop searching (unless computing retained size)if (shortestPathsToLeakingObjects.size leakingObjectIds.size) {//4if (computeRetainedHeapSize) {listener.onAnalysisProgress(FINDING_DOMINATORS)} else {breakvisitingQueue}}}when (val heapObject graph.findObjectById(node.objectId)) {//5is HeapClass - visitClassRecord(heapObject, node)is HeapInstance - visitInstance(heapObject, node)is HeapObjectArray - visitObjectArray(heapObject, node)} } return PathFindingResults(shortestPathsToLeakingObjects, dominatedObjectIds)} 1GCRoot对象都入队 2队列中的对象依次出队判断对象是否访问过若访问过则抛异常若没访问过则继续 3判断出队的对象id是否是需要检测的对象若是则记录下来若不是则继续 4判断已记录的对象ID数量是否等于泄漏对象的个数若相等则搜索结束相反则继续 5根据对象类型类对象、实例对象、对象数组对象按不同方式访问该对象解析对象中引用的对象并入队并重复2。 入队的元素有相应的数据结构ReferencePathNode 原理是链表可以用来反推出引用链。 findShortestPathsFromGcRoots 是查找泄漏对象到Gcroot最短路径这个我和其他同类文章认为的不同他们觉得是只有最短路径才能被直接访问到而其他更长的路径引用中可能包含其他非直接引用的对象这些对象不可能是泄漏点。我没法理解这样的解释我个人理解是这个算法用的是广度优先算法因为与深度优先算法比广度优先的长处是速度快缺点是占用空间从下面一层一层的查找到最近最短的路径这个肯定是泄漏的是要我们处理的。而其他引用路径就算有也是下一次去解决这种情况从概率上说是很小的也就是就算有也会在下一次找到在下一次还是最短路径。这种算法是保证最快的找到泄漏的引用链反正你所有的泄漏都是要处理的按这个顺序能保证最快。 下图就是我们使用的时候收到的通知消息可见一斑。 就先到这里吧有时间再把里面的细节梳理一下吧。
http://wiki.neutronadmin.com/news/187658/

相关文章:

  • 福州网站定制公司做网站需要多少
  • 苏州好的做网站的公司泰安房产网签最新情况
  • 西安营销型网站网站建设开放的端口
  • linux 配置网站域名简单网页源代码
  • 竹中建设官方网站wordpress 注册验证码
  • 手机网站快速排名 软件网上做ps赚钱的网站
  • 网站的着陆页做网站和做网页的区别
  • 网站建设往年的高考题查看网站主机
  • 有什么公司建网站如何做微信小程序网站
  • 企业门户网站平台建设招标采购文件网站建设推广群
  • 网站开发与维护项目招标站长工具流量统计
  • 网站空间可以通过什么获取网站的seo
  • 武义做网站广州市网站建设企业
  • 黑龙江恒泰建设集团网站人力外包
  • 2015年全球网站优秀设计师最专业的外贸网站建设公司
  • 做公司网站解析网站开发与设计教程pdf
  • 项目四网站建设内容Python爬取wordpress
  • 上海专业做网站公司电话公司网站建设规划方案
  • 做的网站在ie会乱码成都住建局官网住建蓉e办
  • 网站开发需要申请专利吗娄底网站建设工作室
  • 用帝国cms做网站电脑上无法安装wordpress
  • 深圳市深圳市住房和建设局网站哈尔滨建站哪个好
  • 增长超人做网站多少钱各网站收录
  • 运城市网站建设网站后台的作用
  • 湖北省住房和城乡建设厅网站的公示公告网站被k
  • 长春网站优化实战铜川市新区建设局网站
  • 在线音乐网站开发教程济宁网站建设神华
  • 股票交易平台app排行榜seo综合查询可以关了吗
  • 德国服务器网站搭建一个商城需要多少钱
  • 建设中的网站备案期间做什济南教育加盟网站建设