JNI是什么
Java编译器把Java文件编译为字节码文件之后,jvm执行引擎将字节码指令解释为对应操作系统能运行的指令,这也是为什么Java是编译和解释共存的语言。当Java代码执行的时候,需要调用底层的c或者c++写的本地方法,所以这里就需要本地方法接口(JNI)去和本地方法库做交互。
JVM的垃圾回收机制是怎么样的?
想要回收垃圾,先得看一个对象他是不是垃圾,一般有两种方法:
- 引用计数法:如果对象被引用了,计数器+1,如果取消引用了就-1,计数器为零就可以回收了,简单除暴。但是他无法处理循环引用的问题。
- 可达性分析:对象A引用B,B引用C,C引用D会形成一个有向图。可达性分析会从根对象(gc root)出发遍历这个有向图,遍历不到的就是不可达对象,就是垃圾。
- 三色标记法:用于遍历标记判断的,用三种颜色去标记对象的状态。但是存在两个问题,一个是浮动垃圾,另一个是漏标的问题。
判断对象是垃圾之后,就需要使用垃圾回收算法去处理。基础的算法有三种:
- 标记清除算法:从gc roots 出发,去遍历标记所有可达性的对象,之后遍历堆去清除所有不可达的对象。缺点会产生内存碎片。
- 标记整理算法:先标记,之后把存活的对象移到内存的一边,另外一边直接清理掉。但是移动的成本比较高,停顿较大。
- 复制算法:会将内存分为两个区域,分配对象的时候分配到一个区域,存活的时候把对象复制到另一个区域的同时将远来区域的给清空。但是空间利用率比较低。
这三种算法根据垃圾和对象的多少去进行选择,基于这种场景,jvm就把堆区分成了两块。
- 新生代:放新出生的对象,这里的对象大多朝生暮死,往往垃圾多,存活对象少,就适合使用复制算法。
- 老年代:存活时间久的对象会被放到老年代(新生代存活久了晋升的),垃圾少,适合使用两种标记算法。
这也叫做分代收集算法,也是java再用的一个垃圾回收算法
垃圾回收器了解吗?
- 串行垃圾回收器:单线程,stw短,实现简单全程stw
- 并行垃圾回收器:多条垃圾收集线程并行工作,但此时用户线程任然处于等待状态。也是全程STW。
- 并发垃圾回收器:用户线程和垃圾收集线程同时执行。低停顿(CMS,老年代)或者可预测停顿(G1)
双亲委派了解吗?
那的先聊类的加载器,Java的类加载器分为:
- bootstrap class loader:主要加载位于%javahome%/lib下的一个核心类库。这是爷爷背的
- extension class loader:主要加载%javahome%lib/ext目录下的类。这是父亲背的
- application class loader:主要加载classpath下的这个类。这是儿子背的
- 自定义类加载器:
所谓的双亲委派,其实就是类逐级加载的规则:儿子做类加载的时候,先看看他爹能不能加载,他爹会先去问他爷爷能不能加载。爷爷能加载就让爷爷加载,爷爷加载不了就让他爹加载,都加载不了,就只能儿子自己加载。这个过程就叫委派。
这个好处是避免了重复加载,核心api比较安全
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 coder-xuyong!
评论






