Java相关


Java相关

垃圾回收

引用计数法

一个对象如果没有任何与之关联的引用,即他们的引用计数都不为 0,则说明对象不太可能再被用到,那么这个对象就是可回收对象

可达性分析

通过一系列的“GC roots”对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收

分代收集算法

分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法
大部分 JVM 的 GC 对于新生代都采取 Copying 算法,因为新生代中每次垃圾回收都要回收大部分对象,即要复制的操作比较少,但通常并不是按照 1:1 来划分新生代。一般将新生代划分为一块较大的 Eden 空间和两个较小的 Survivor 空间(From Space, To Space),每次使用Eden 空间和其中的一块 Survivor 空间,当进行回收时,将该两块空间中还存活的对象复制到另一块 Survivor 空间中
Copying算法:按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉

老年代因为每次只回收少量对象,因而采用 Mark-Compact 算法.
Mark-Compact算法:标记阶段标记出所有需要回收的对象,标记后不清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。

内存泄漏->内存溢出

程序在申请内存后,无法释放已申请的内存空间是内存泄漏。
程序申请内存时,没有足够的内存供申请者使用是内存溢出。
内存泄漏的堆积最终会导致内存溢出。

引用类型

  • 强引用:把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收
  • 软引用:软引用需要用 SoftReference 类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中
  • 弱引用:弱引用需要用 WeakReference 类来实现,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存
  • 虚引用:虚引用需要 PhantomReference 类来实现,任何时候可能被GC回收,就像没有引用一样,无法通过虚引用访问对象的任何属性或者函数,用来跟踪对象被垃圾回收的状态

IO/NIO

异步IO模型

当用户线程发起 read 操作之后,立刻就可以开始去做其它的事。内核会等待数据准备完成,然后将数据拷贝到用户线程,当这一切都完成之后,内核会给用户线程发送一个信号,告诉它 read 操作完成了。用户线程完全不需要实际的整个 IO 操作是如何进行的,只需要先发起一个请求,当接收内核返回的成功信号时表示 IO 操作已经完成,可以直接去使用数据了。

NIO

NIO 主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector
传统 IO 基于字节流和字符流,NIO 基于 Channel 和 Buffer(缓冲区)进行操作

Channel

Channel 相当于 IO 中的 Stream(流),不过Stream是单向,Channel是双向

Buffer

缓冲区,实际上是一个容器,是一个连续数组,读取或写入的数据都必须经由 Buffer
客户端发送数据,先存入buffer,然后写入通道。

Selector

Selector 能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样用一个单线程就可以管理多个通道

JVM 类加载机制

类加载:加载,验证,准备,解析,初始化
加载:会在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的入口
验证:确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
准备:准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。这里赋值如果是这种public static int v = 1111,那么准备阶段赋值为0,编译后赋值1111.如果加了final,准备阶段赋值就是1111
解析:虚拟机将常量池中的符号引用替换为直接引用的过程

Java集合




  目录