课程名称:笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机
课程章节:第6章 JVM原理篇
主讲老师:求老仙
课程内容:
第6章 JVM原理篇
课程收获:
问题1)Java的对象在内存中的结构?
问这个问题其实,就是在问,对象的声明周期和Object在内存中的格式
问题2)对象的生命周期?
Object首先被加载到内存中,将class文件,通过ClassLoader加载到方法区,生成类型对象。
同时初始化静态成员变量和静态代码块,这是Load要做的事情。
第二步走到创建对象,创建对象,首先分配内存,调用构造函数等操作,创建完毕
第三步就是使用对象,如果gc从根节点root set可以找到该对象,说明可以继续存活,但有一种情况,会出现泄漏的情况,就是:创建了之后,一直没有被使用,同时也无法被回收,
例如:对象X是创建了,但是下面的while循环是死循环,所以x对象一直被当前对象引用,就会产生内存泄漏
问题3)classLoader如何打破双薪委派模型?
双亲委派模型:自低向上的检查,类是否被加载。如果没有被加载,就自顶向下进行加载。
ClassLoader的作用,是将.class文件,加载到方法区,生成类类型对象
问题4)不同的代码版本,使用不同的classLoader?以及好处?
通过前端,传递过来不同的参数,调用不同的api(重载),api走的是不同的业务逻辑。(对应的版本1中所有的类都需要用对应的自定义类去加载,版本2的代码用自定义类加载器去加载。)
好处:使用类加载器加载的类相互隔离的原来,来完成代码的区分
上面能看到下面,下面能看到上面,同级看不到。
使用classLoader加载不同版本的代码的好处,例如:这样foo和Bar类是不同的类加载器加载,是不可见的,但是他们的父加载器是可以看到他们两个类,所以可以将共用的代码逻辑,用父类加载器加载,这样foo也可以看到父类加载的内容,Bar也可以。