西维蜀黍

【Java】枚举实现单例模式

背景

单例模式的不同实现

  ...


【Java】同步容器与线程安全问题

问题

对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全?

  ...


【Java】String - String.intern()方法

背景

String 类型拥有一个字符串常量池(String Constant Psool),使用字符串常量池包括以下两种方式:

  ...


【Java】垃圾回收 - 分代垃圾回收

为什么要分代?

分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的

因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。

在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。

试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长。同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。

因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。

如何分代?

如图所示,虚拟机中的共划分为三个代:新生代(Young Generation)老年代(Tenured Generation)持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。新生代和老年代的划分是对垃圾收集影响比较大的。

  ...


【Java】对象的内存分配 - 垃圾回收过程

对象的内存分配 - 垃圾回收过程

1 对象分配到新生代区域中

所有new出来的对象都会最先分配到新生代区域中,两个survivor区域初始化是为空的。

  ...