2021年终总结——盘点2021年学到的知识

406 阅读4分钟

「时光不负,创作不停,本文正在参加2021年终总结征文大赛

背景介绍

今年刚毕业,在一家公司实习做Android软件开发,用的语言是kotlin,之前没有接触过第一次用这个语言,说说我的感受吧:

1.相比之前Java来说kotlin确实简洁很多,之前一直以为安卓也是用的JVM,但是今年看书看博客才发现原来并不是。。。

2.JVM其实还是要学的,因为在学习校的时候也没有认真了解过,今年趁着实习的机会和办公室大佬们学习了不少东西,接下来给大家讲讲我今年的收获吧哈哈

我的收获

今年最大的收获就是读了深入理解JAVA虚拟机这本书,虽然我是做移动端的开发,用的虚拟机是ART和Davlik,但是了解JVM还是很有用的,其中大量借鉴了JVM中的设计。接下来我盘点几个【以下说的都是HotSpot虚拟机】:

1.方法签名的组成包括方法名参数列表

2.方法传参时根据参数是refrence类型还是基本类型会有不同的处理方式。

refrence类型相当于引用,传递的时候直接将引用的地址传递。

但是如果是基本类型的传递的话就是值传递,会在本地变量表里面进行创建一个变量将值赋值给这个变量。

3.其实方法区也是会进行垃圾回收的,只不过回收的条件比较苛刻。

对于常量来说,当没有人引用到这个常量时就会被回收掉;

但是对于类来说,需要达到的条件要满足这三个:1.没有任何实例指向这个类.该类的所有对象都已被清除        2.该类的java.lang.Class对象没有被任何对象或变量引用。只要一个类被虚拟机加载进方法区,那么在堆中就会有一个代表该类的对象:java.lang.Class。这个对象在类被加载进方法区的时候创建,在方法区中该类被删除时清除。                 3.加载这个类的ClassLoader被回收掉 4.方法区在JDK7以前叫做永久代是被划分在堆里面的,而在JDK8的时候被划分到了本地内存中叫元空间 注意:表面上看没有什么大影响,其实针对某些方法得到的结果是完全不同的,最典型的列子是String的intern()方法

5.JVM堆区中划分为年轻代和老年代,年轻代分为一个Enen和两个Survival区域,当时不知道为什么要这样划分,但是现在有了一定的理解:

垃圾回收的时候其实采用的算法就那几种,最基础的就是标记清除算法,后来有了标记复制和标记整理。因为根据“研究发现”年轻代的对象百分之九十八都是第一次就被回收掉的,所以采用的是标记复制,而直接划分一半内存又有点浪费,所以采用一个Enen区和两个Survival分成了八比一Enen和Survival。只弄一小部分内存Survival来存放活着的对象,当存放不下时放到老年代即可。

6.回收年轻代对象时,因为老年代可能会引用里面的对象,所以除了规定的GC ROOTS还需要扫描整个老年代看是否有老年代中的对象引用它。

采用记忆集的方式,里面存放着老年代中那些需要引用年轻代里面对象的内存地址,这样年轻代GC时根据记忆集查找就行,不需要扫描整个老年代。

目前这本书还在看,但是感触非常深刻,有兴趣的也可以去看看这本书!

2022展望

1.巩固数据结构和算法知识

2.阅读15本技术书籍

3.掘金发布博客达到10篇

4.看完深入理解JAVA虚拟机和Android艺术探索这两本书