优秀的程序员更重视阅读源码,不看源码那是假的

简介:

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

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

程序调用System.gc时可以触发;
系统自身来决定GC触发的时机。
系统判断GC触发的依据:根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程。
image
新生代、老年代结构minor gc/full gc,还需要了解Minor GC 金额Full GC 触发条件

Minor GC触发条件:

当Eden区满时,触发Minor GC。
Full GC触发条件:

调用System.gc时,系统建议执行Full GC,但是不必然执行
老年代空间不足
方法去空间不足
通过Minor GC后进入老年代的平均大小大于老年代的可用内存
由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
02、“对什么东西”

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

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

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

03、“做了什么事情”

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

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

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

作为一名初学者,刚接触源码,往往让初学者手足无措。**我们可以先把源码安装起来编译起来,结合它的操作文档,熟悉其功能和它的api。
**
要是遇到的英文文档,英文水平还可以,能让你阅读英文的水平大幅提升。

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

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

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

阅读源码时要是看到工具类,要尽量去熟悉。这一步的分析可以学习到源代码的系统架构方式。我们可以从中学到源码的编写技巧,有助于提高我们的编码能力。
结合一些安全规则,研究源码在安全方面是如何设计的。这样可以提高自己在安全方面的意识。
研究系统所用到设计模式,一样的功能实现,用到的设计模式可能相差很多,对比我们之前所作的东东分析设计模式。对于设计模式,笔者从遇到一位从事4年多Android开发的同事,对设计模式并不重视,譬如建造者模式,AlertDialog.Builder这个,项目里到处都用,可他就是不知道是怎么实现,其实AlertDialog.Builder就是使用了Builder模式来构建AlertDialog的。
纸上得来终觉浅,得知此事要躬行。我们可以写一些简单的demo,注意是要自己手动编写,不要想当然,并且调试出来,这样才能做到更加理解代码。好的,今天就给大家分享一些源码架构的资料

源码分析

程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。这也造成了很多错误看源码的方式。
那要如何正确的分析源码呢?
我们的目标应该放在最常用的框架上面,下面就介绍两个:一个是Spring,另一个是大家用来觉得一直不怎么出问题的Mybatis。

△spring源码

image
分布式架构

随着我们的业务量越来越大和越重要,单体的架构模式已经无法对应大规模的应用场景,而且系统中决不能存在单点故障导致整体不可用,所以只有垂直或是水平拆分业务系统,使其形成一个分布式的架构,利用分布式架构来冗余系统消除单点的故障,从而提高整个系统的可用性。同时分布式系统的模块重用度更高,速度更快,扩展性更高是大型的项目必不可少的环节。

image
微服务

关于微服务架构的取舍
在合适的项目,合适的团队,采用微服务架构收益会大于成本。
微服务架构有很多吸引人的地方,但在拥抱微服务之前,也需要认清它所带来的挑战。
需要避免为了“微服务”而“微服务”。
微服务架构引入策略 – 对传统企业而言,开始时可以考虑引入部分合适的微服务架构原则对已有系统进行改造或新建微服务应用,逐步探索及积累微服务架构经验,而非全盘实施微服务架构。

image
JVM和性能优化
image
今天就先分享到这,如果你对以上架构资料感兴趣的话可以加群:795632998,进群可以获取获取Java架构学习资料、源码、笔记,学习视频有Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

目录
相关文章
|
6月前
|
程序员 开发工具 Python
最全学Python有什么用?看完这些你肯定明白_学pysion的作用,2024年最新字节跳动面试严格吗
最全学Python有什么用?看完这些你肯定明白_学pysion的作用,2024年最新字节跳动面试严格吗
最全学Python有什么用?看完这些你肯定明白_学pysion的作用,2024年最新字节跳动面试严格吗
|
设计模式 存储 JSON
如何写出一手好代码(上篇 - 理论储备)?
技术能力是研发同学的立身之本,而写代码的能力又是技术能力的重要体现。但可惜的是理想很丰满,现实很骨感。结合慕枫自己的经验来看,我们在工作中其实没那么容易可以看到写得很好的代码。
|
设计模式 监控 算法
程序员优秀之路:一起来看下这 97 位”砖家“能给出啥编程的好建议?(5)
本瓜并未逐字逐句翻译,而是取其精要、理解抽象,结合自身进行撰文表达,与各位看官分享。认知好的编程概念,走向优秀~
|
机器人 程序员 编译器
程序员优秀之路:一起来看下这 97 位”砖家“能给出啥编程的好建议?(1)
咱们程序员在接到需求初期,是没办法对整个需求作完全正确评估的!(本瓜以为,由产品需求到技术落地是有着天然的鸿沟的)所以,多数情况下,我们都会在代码迭代过程中面对之前未预想到的问题。
|
设计模式 缓存 Java
程序员优秀之路:一起来看下这 97 位”砖家“能给出啥编程的好建议?(2)
本瓜并未逐字逐句翻译,而是取其精要、理解抽象,结合自身进行撰文表达,与各位看官分享。认知好的编程概念,走向优秀~
|
缓存 小程序 测试技术
建议收藏!初级软件测试面试题及题库答案,你肯定用得上
软件测试的面试过程中,面试官往往都会根据你面试的职位,提问一些相关的软件测试知识,而很多人为了能够提高的自己在面试当中的通过率,都会在面试前做好充足的准备。
512 0
|
测试技术
初级软件测试面试题怎么找?提供的这两个地方你肯定用得上
最近几年,随着电子产品和互联网的蓬勃发展,各类科技公司如雨后春笋般出现,而软件公司作为科技类公司中的重要组成部分,在这支互联网大军中也占据了重要一席。因而,负责软件问题质检的软件测试岗位也逐渐成了这几年炙手可热的就业岗位之一。
148 0
|
开发者 Python
一日一技:8行炫技代码,知识点多得不得了
一日一技:8行炫技代码,知识点多得不得了
290 0
一日一技:8行炫技代码,知识点多得不得了
|
程序员
都说代码注释是程序员必备技能,但是你这注释也太奇葩了吧!
都说代码注释是程序员必备技能,但是你这注释也太奇葩了吧!
151 0
都说代码注释是程序员必备技能,但是你这注释也太奇葩了吧!
|
算法 Java 程序员
20位程序员关于求职的疑问,以及我给出的参考答案
作者:陆小凤 首发:公众号【程序员江湖】 阅读本文大概需要 6 分钟。 前几天发了一条朋友圈对于求职小伙伴们提出的问题,我进行了收集整理,统一反馈。也许这20个问题也是你们遇到的问题,所以趁着年前赶紧把它发出来。