javac Hello.java
java Hello
3、类加载器
1)Java中的类加载器
2)加载流程
-
Loading:类的信息从文件中获取并载入到JVM的内存中。
-
Verifying:检查读入的结构是否符合JVM规范的描述。
-
Preparing:分配一个结构用来存储类信息。
-
Resolving:把类的常量池中的所有符号引用变成直接引用。
-
Initializing:执行静态初始化程序,把静态变量初始化成指定的值。
4、内存管理
java中的内存管理指的是下图中“内存空间”部分的内存操作。
1)Java栈区:
作用:存放java方法执行时所有的数据。 组成:由栈帧组成,一个栈帧代表一个方法的执行。
Java栈帧:每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈。它描述了一个方法的局部变量表、栈操作数、动态链接、方法出口。
2)本地方法栈
与Java栈区基于一致。
作用:本地方法栈是专门为native方法服务的。
3)方法区
存储被虚拟机加载的类信息、常量、静态常量、即时编译器编译后等数据(这些数据在程序启动后会永远占据内存)。
4)堆区
作用:所有通过new创建的对象的内存都在堆中分配。 特点:是虚拟机中最大的一块内存,是GC要回收的部分。
对于堆区,其内存结构还有些不一样的地方,先看下图:
简单来说,堆区分为新生代(Young Generation)与老年代(Old Generation),程序在创始对象时,对象会先被分配到新生代中,当新生代区内存不足时,JVM会通过一定的算法规则将新生代中的对象转移至老年代中,当新生代与老年代都没有足够的内存空间时,JVM就会抛出OOM异常。
5、垃圾回收
1、垃圾收集算法
1)引用记数算法(jdk1.2之前)
在内存创建对象的同时,会为它创建一个引用记数器,并将引用记数器加1,每次有引用引用到此对象时,记数器就会累计加1,而当其中一个引用销毁时,记数器就会减1,当引用记数器为0时,说明该对象已经是垃圾对象,下次gc时,对象就会被回收了。
弊端: 对象A与对象B互相引用时,这2个对象的引用记数器永远是正数,当这2个对象都没有被其他对象所引用时(对象不可达),会因为它们的引用记数器不为0导致它们不会被gc回收。
2)可达性算法(jdk1.2 +)
也称为根搜索算法。把程序所有的引用关系看做是一张图(有向图),从GC Root节点开始寻找所有的引用节点,当所有的引用节点寻找完毕之后,剩余的节点被认为是没有引用的节点,即不可达的节点,就是垃圾对象。
上图中ObjD、E、F因为没有路径可达,所以是垃圾对象。
2、引用的类型
java中的引用类型有4种:强引用、软引用、弱引用、虚引用。其中,强引用和弱引用在开发中最常用。
弱引用的创建
// 强引用
Object obj = new Object();
// 弱引用,此时obj与wf都引用了Object对象
WeakReference wf = new WeakReference(obj);
// 断开强引用,此时只有wf引用这个Object对象
obj = null;
// 通用弱引用获取Object对象(可能为null)
wf.get();
在使用wf.get()时,要判断获取到的对象是否为null,因为弱引用不会阻止对象的回收。
3、垃圾回收算法
1)标记-清除算法
从根集合遍历所有的引用,上图中,根集合引用了A,A引用了C,B是不可达的对象引用,在扫描阶段中,B会被标记为垃圾对象,当垃圾回收机制执行时,会直接将B对象置为空,此时内存块中就只剩下A、C对象引用,B就被垃圾回收给回收掉了。 优点:不需要进行对象的移动,仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效。 缺点:由于标记-清除算法会直接回收掉不存活的对象,会造成内在碎片,不利于后续对象的分配
2)复制算法
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
学习宝典
对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
【算法合集】*
[外链图片转存中…(img-usrRb3VA-1711543806836)]
【延伸Android必备知识点】
[外链图片转存中…(img-VFAGnq8G-1711543806836)]
【Android部分高级架构视频学习资源】