程序员

注册

 

发新话题 回复该主题

不看源码的程序员不是好程序员,工作忙并不 [复制链接]

1#

分享职场生活、职场攻略、领导同事相处技巧和创业资源

洪生鹏

01

从事java开发的都知道java有个垃圾回收机制Garbagecollection,要准确理解Java的垃圾回收机制,我们可以从:“什么时候”,“对什么东西”,“做了什么事情”这三个方面来分析。01、“什么时候”

“什么时候”即是GC触发的条件。GC触发的条件有两种:

程序调用System.gc时可以触发;系统自身来决定GC触发的时机。

系统判断GC触发的依据:根据Eden区和FromSpace区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程。

新生代、老年代结构minorgc/fullgc,还需要了解MinorGC金额FullGC触发条件

MinorGC触发条件:

当Eden区满时,触发MinorGC。

FullGC触发条件:

调用System.gc时,系统建议执行FullGC,但是不必然执行老年代空间不足方法去空间不足通过MinorGC后进入老年代的平均大小大于老年代的可用内存由Eden区、FromSpace区向ToSpace区复制时,对象大小大于ToSpace可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

02、“对什么东西”

要是在面试时,面试官问“对什么东西”,有的求职者回答没有用的对象,按道理来说,这并没有错,只是这并不是理想的答案。要是能更进一步分析,那就更好了,GC操作的对象分为:通过可达性分析法无法搜索到的对象和可以搜索到的对象。对于搜索不到的方法进行标记。从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。

对于用可达性分析法搜索不到的对象,GC并不一定会回收该对象。要完全回收一个对象,至少需要经过两次标记的过程。

把问题具体化了一些,对类似这样的对象进行回收,相信能给你这次面试加分。

03、“做了什么事情”

这个问题,回答空间其实挺大的,笼统地回答删掉暂没有使用的对象,节省内存。也不能说有错误,但要是我们能把问题再具体化一些,效果会更好。

要想搞清楚所以然,这就要求我们平时在开发中,要多留意去看看源代码。阅读源码的好处:一方面可以我们从中学习代码的架构,编码风格等,另一方面有助于我们了解正在做的东西的实现原理,用到哪些算法、数据结构等。有助于我们知其然又知所以然。

02

那么我们如何阅读源码呢?正确的学习方法不仅能够让我们事半功倍,也能够让我们更容易理解来龙去脉。

作为一名初学者,刚接触源码,往往让初学者手足无措。我们可以先把源码安装起来编译起来,结合它的操作文档,熟悉其功能和它的api。

要是遇到的英文文档,英文水平还可以,能让你阅读英文的水平大幅提升。

浏览源码的目录结构,了解各个目录的功能。从整体上理清这个工程由哪些模块组成,最好能自己手动画一份目录结构图。

经过前面两步相信你对这个工程有了初步的了解。

熟悉源码编码风格,是采用驼峰命名规则还是匈奴利亚法。平时在阅读时,不妨参考下面3点做法。

阅读源码时要是看到工具类,要尽量去熟悉。这一步的分析可以学习到源代码的系统架构方式。我们可以从中学到源码的编写技巧,有助于提高我们的编码能力。结合一些安全规则,研究源码在安全方面是如何设计的。这样可以提高自己在安全方面的意识。研究系统所用到设计模式,一样的功能实现,用到的设计模式可能相差很多,对比我们之前所作的东东分析设计模式。对于设计模式,笔者从遇到一位从事4年多Android开发的同事,对设计模式并不重视,譬如建造者模式,AlertDialog.Builder这个,项目里到处都用,可他就是不知道是怎么实现,其实AlertDialog.Builder就是使用了Builder模式来构建AlertDialog的。

纸上得来终觉浅,得知此事要躬行。我们可以写一些简单的demo,注意是要自己手动编写,不要想当然,并且调试出来,这样才能做到更加理解代码。好了,今天的分享就先到这,感谢阅读!

分享 转发
TOP
发新话题 回复该主题