-
-Xms -Xmx参数 相等?
如果二者不等,最开始的时候堆大小是Xms,随着heap内存消耗,jvm很有可能需要申请更大的空间直到Xmx;每一次调整(gc)都需要一定的系统开销(jvm与os之间)。生产环境一般一台机器或者一个容器只有一个服务,所以可以二者相等 -
双重锁检查,单例
public class Singleton { private volatile static Singleton entity; public Singleton getInstance() { if (null == entity) { synchronized (Singleton.class) { if (null == entity) { entity = new Singleton(); } } } return entity; } }
-
锁
锁 | 说明 |
---|---|
synchronized | 可重入,悲观锁 |
ReentrantLock | 可重入,可公平,悲观锁 |
cas | 由硬件实现的同步源语,ReentrantLock由cas实现,可以实现乐观锁 |
-
自旋锁:可以认为是获取锁的一种方式。当线程发现资源被锁住后,此时不立刻挂起线程,而是通过一定时间内的自循环,来尝试获取锁。这可以少线程阻塞造成的线程切换,能得到较大的性能提升。
-
synchronized 的优化,最初synchronized必然会引起的内核态与用户态切换、线程阻塞造成的线程切换(重量级锁)。现在synchronized有一个锁膨胀过程,即
偏向锁->轻量级锁->重量级锁。- 轻量级锁:仅仅将Mark Word(对象头的一部分)中的部分字节CAS更新,如果更新成功,则获取成功;否则,发生了激烈锁竞争,膨胀为重量级锁。
- 轻量级锁,不需要系统调用
- 第一次失败后,可以通过自旋的方式在次尝试
- 偏向锁:假定有且仅有第一个申请锁的线程会使用锁,因此,只需要在Mark Word中CAS记录,如果成功,则获取成功。否则,说明有其他线程竞争,膨胀为轻量级锁。
- 偏向锁无法使用自旋锁优化,因为一旦有其他线程申请锁,如果自旋,就破坏了偏向锁的意义。
- 轻量级锁每次申请、释放锁都至少需要一次CAS,但偏向锁只有初始化时需要一次CAS。
- 偏向锁适用于无竞争的情况,轻量级锁适用于轻度竞争的情况,重量级锁适用于竞争激烈的情况
- 轻量级锁:仅仅将Mark Word(对象头的一部分)中的部分字节CAS更新,如果更新成功,则获取成功;否则,发生了激烈锁竞争,膨胀为重量级锁。
-
复制算法为什么有两块Survivor空间
如果只有一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移到另一块,剩下的对象直接清理即可。