在面试中被问到Java相关的东西非常多:
首先说下Java内存模型:
主要由:
程序计数器,Java虚拟机栈,本地方法栈=>被线程私有
方法区 堆组成=>被线程共有
Java类加载机制ClassLoader
主要分为:启动类加载器(C,C++编写的),系统类加载器,扩展类加载器(也可以自定义加载器)
在Java中class字节码文件什么时候被JVM加载进内存呢?
分为两种情况,1,当调用类构造器 2.调用类中的静态变量或者静态方法
在Java中JVM默认的加载机制叫做双亲委派机制是Java推荐的机制,并不是强制的机制,如果我们需要打破这种加载机制可以自定义类加载器,重写loadClass方法即可。
什么是双亲委派机制呢?
当类加载器收到加载类或者资源请求时,通常来说首先会委托给自己的父类去加载,只有当父类找不到指定类或者资源时,才会执行自身的类加载过程就叫做双亲委派机制。
Java垃圾回收机制:
在Java垃圾回收中主要有一种叫做可达性分析,首先以GCRoot为根节点向下查找,能被GCRoot直接或间接引用到的对象为可用对象,相反不能被GCRoot直接或间接引用到的对象会被Java虚拟机当作垃圾在不确定的时间被回收掉。
问题:那些对象可以作为GCRoot?
1.Java虚拟机栈中引用的对象
2.方法区中静态引用的对象
3.仍处于存活中的线程对象
4.Native方法中引用的JNI对象
Java垃圾回收算法:
1.标记清除算法 优点:实现简单不需要将对象进行移动 缺点:需要中断进程内其它组件的执行
第一步标记mark,第二步清除swipe
首先以GCRoot为根节点向下查找不能直接俄或间接被GCRoot引用到的对象会被标记视并且为垃圾被GC在不确定的时间被回收
2.复制算法 优点:按照顺序分配内存空间即可,实现简单运行高效不用考虑内存碎片 缺点:可用内存大小为原来的一半,对象存活率高时会频繁进行复制
将现有空间分为两块,每次之使用其中的一块,在垃圾回收时将正在使用中的内存中存活的对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色完成垃圾回收