本地方法接口
一个 Native Method 是一个 Java 调用非 Java 代码的接囗。
一个 Native Method 是这样一个 Java 方法:该方法的实现由非 Java 语言实现,比如 C 。
为什么使用本地方法
Java语言需要与外部环境进行交互,直接访问操作系统的接口即可
执行引擎
作用: 将加载到内存中的字节码(不是直接运行的机器码), 解释/编译为不同凭平台的机器码.
垃圾回收
概述:Java支持自动垃圾回收的,但是自动垃圾回收并不是Java首创的.
什么样的对象是垃圾:运行的程序中没有任何引用指向的对象.
为什么要垃圾回收:如果不及时清理垃圾,就会出现内存溢出问题.
在垃圾回收时,可以对内存碎片进行清理.
内存泄漏与内存溢出
内存泄漏:一些已经不用的对象,垃圾回收器不能判断它是垃圾,这些对象就默默的占用内存,称为内存泄漏,大量此类对象的存在,也是导致内存溢出的原因.
内存溢出:经过垃圾回收后,内存中仍然无法存储新创建的对象,内存不够用溢出.
自动内存管理
好处:对内存管理更合理,自动化.
缺点:不能调整垃圾回收机制.
垃圾回收相关算法
标记阶段:
作用:判断对象是否是垃圾对象,是否有引用指向对象.
相关的标记算法有:引用计数算法、可达性分析算法.
引用标记算法
有个计数器来记录对象的引用数量.
缺点:需要维护计数器,占用空间,频繁操作需要时间开销.
无法解决循环引用的问题.
(循环引用:指多个对象相互引用,但是没有其他外部引用指向它们,且它们的计数器都不为0,无法进行垃圾回收,会导致内存泄漏)
可达性分析算法(根搜索算法)
实现思路:从一些作为根对象的对象出发查找,与根对象直接或间接连接的对象就是存活对象,不与根对象直接或间接相连的对象就是垃圾对象.
根对象可以是那些元素:
1.在虚拟机栈中被使用的.
2.在方法中存储的静态成员指向的对象.
3.被同步锁synchronized使用的.
4.在虚拟机内部使用的对象.
对象的finalization机制
当一个对象被标记为垃圾后,在真正被垃圾回收之前,会调用一次Object类中的finalize().判断是否还有逻辑需要处理.finalize()方法,只会被调用一次,垃圾回收机制会自己调用,不需要手动调用,如果手动调用,则垃圾回收机制不会再次调用.
有了finalization机制的存在,在虚拟机中把对象状态分为以下三种:
1.可触及的:不是垃圾,与根对象相连接.
2.可复活的:判断为垃圾,且还没有调用finalize()方法(通过finalize()方法可以复活的对象).
3.不可触及的:判断为垃圾,且经过finalize()方法没有被复活的对象,该类对象会被垃圾回收.
回收阶段:
标记——复制算法
将内存分为大小相等的两份空间,把当前使用的空间中存活的对象复制到另一个空间中,将正在使用的空间中的垃圾对象清除
优点:减少内存碎片
缺点:如果需要复制的对象较多,效率低
适用场景:存活对象少的,新生代适合使用标记复制算法
标记——清除算法
清除并不是真正的清除,而是将垃圾对象地址存储到一个空闲列表中,后面有新的对象到来时,新对象直接覆盖掉垃圾对象即可
优点:实现简单
缺点:效率低,回收后有碎片产生
标记——压缩算法
在标记——清除算法的基础上增加了一次内存碎片整理
标记——清除算法,标记——压缩算法适合老年代垃圾回收
垃圾回收器
垃圾收集器是垃圾回收的实际实现者,垃圾回收算法是理论实践
垃圾回收器分类
按线程数量分:
单线程 :Serial,Serial old
多线程 :Parallel
按工作模式分:
独占式:垃圾回收线程执行时,其他线程暂停
并行式:垃圾回收线程可以和用户线程同时执行
按工作的内存区间分:
年轻代垃圾回收器
老年代垃圾回收器