安卓面试学习day01

我真是学吐了
虚心学习,记住面试OK时候的感觉,刨根问底。需要有自己的思考。
目录:JVM、Object.equals、hashcode

Java汇总

JVM

1、JVM工作流程
回答:Java数据从classloader传入虚拟机内,转为二进制数据,之后由程序计数器、虚拟机栈、本地方法区、堆、方法区。
在这里插入图片描述自己思考:源代码文件如何编译成字节码文件的呢?
实际上就是最早学习时候的使用Javac在命令行中编译的操作,对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里有一个 javac 工具,就是它将 Java 代码翻译成字节码,这个工具我们叫做编译器。相对于后面要讲的其他编译器,其因为处于编译的前期,因此又被成为前端编译器。无论你使用什么语言,最后还是机器码在运行。

2、运行时数据区
回答:其实应该叫内存区域吧,私有部分:程序计数器、虚拟机栈、本地方法区。共有部分:堆和方法栈。
这里面需要延伸一些东西,比如每个区域的作用,每个区域会出现的错误。
复习一下
程序计数器:就是确定你程序运行到哪里的一个计数器,比如走到第一行就会是1,向下走就会变为2。这个区域内不会出现错误
虚拟机栈:一个方法中开启这个栈,里面输入一些这个方法需要的数据,最后运算出结果返回,因为使用的结构是栈式的结构,所以叫做虚拟机栈。这个区域中会出现outofmemeory和outofstack的错误,那么问题
本地方法区:存放一些本地方法的地区。执行的是Native方法,
堆:共有变量中存放对象的部分,基本对象的创建出生和死亡都在这个区域内,从这个区域中又可以牵扯出对象的存放和GC
方法区:存放一些本地变量,static修饰的变量会在这里提前创建好哦
答案:在这里插入图片描述
思考:本地方法栈仍有些不具体,什么是Native方法呢,比较简单的说就是java的方法,但是不是用java语言写的,这些方法仍然生效,目的是为了提高一些方法没有使用c或者c++快的问题。
3、方法指令
回答:这个还真不知道
答案:
在这里插入图片描述
这个感觉不太重要啊。。
四、类加载器
回答:类加载器是java的class文件进入到内存中必须经过的加载工作。有一个自上而下的加载模式,
答案:在这里插入图片描述
在这里插入图片描述思考:这个问题秋招问的也不多,但是尽量记住委托机制。
4、垃圾gc
4.1、对象存活判断
回答:只要是没被人引用的实例,就可以说是垃圾1、计数法,调用一次就记一次数,返回不用了就减一次数,当为0的时候就可以认为是垃圾了。2、可达性、先每个方法的变量都产生出来,然后每个方法使用到时就会进行可达性检测,如果一个变量长期没有被可达过,那么就可以认为是垃圾。
在这里插入图片描述在这里插入图片描述
4.2、垃圾收集算法
标记-清除算法:第一步:标记,在堆中标记出需要清除的垃圾,第二步是标记完成后回收掉标记对象,但是缺点是效率太慢和内存碎片问题。
复制算法:标记,(然后另外开辟一段相同大小的内存)错误,正确认识是原本就是将之前内存一分为二,只使用一半,在复制过程中,消除垃圾,这解决了碎片化问题,但是没有解决效率问题,原因是大量长生存期的对象大量复制。
标记-整理算法:标记完之后,让所有存活对象移向一端
分代收集算法:基本假设:绝大部分对象的生命周期短,存活时间短
分代收集算法将Java堆分为新生代老年代,新生代死亡比较快,使用复制算法,老年代使用标记清除算法。
4.3、垃圾收集器
CMS收集器:是以标记-清除算法实现的,一共有初始标记,并发标记,重新标记,并发清除四个阶段,初始标记和重新标记需要进行stop the world, 整个过程中最耗时的是并发标记和并发清除,收集器线程可以与用户线程一起工作,CMS收集器的内存回收过程是和用户线程一起并发执行的。
在这里插入图片描述
G1
4.4、内存模型和回收策略
整个堆空间可以简单的分为年轻代1/3和老年代2/3,年轻代分为两个部分,一个eden区,一个survivor区一个from-survivor,一个to-survivor
eden:大多数情况下,对象会在eden区中分配,当eden区没有足够空间进行分配时,虚拟机会发起一次Minor GC,MinorGC比MajorGC频繁,MinorGC后,eden会被清空,绝大部分对象被回收,存活对象进入到From区,如果from区不够,那就到老年代
survivor:缓冲区,在经历MinorGC后,会将from的放到to区,survivor区存在的意义就是减少输送到老年代的对象,从而减少MajorGC的发生,只有经历过16次MinorGC的对象才会被送到老年代
old:占据2/3的内存空间,每次只有majorGC都会触发StopTheWorld,内存越大暂停时间越长,所以老年代采取标记-整理算法。

Object方法

1、equals
回答:equals比较的是两个对象的地址值
来段源码答案
在这里插入图片描述
hashCode:这个是哈希值的意思,每个对象都通过相应的哈希算法有自己的哈希值,在hashmap中有应用,不同的对象有可能因为相应的哈希算法有相同的哈希值,但这并不代表他们两个就相等。
答案:在这里插入图片描述
在这里插入图片描述

发布了21 篇原创文章 · 获赞 0 · 访问量 373

猜你喜欢

转载自blog.csdn.net/jo___jo/article/details/104089716