java 虚拟机杂记

  1. -Xms -Xmx参数 相等?
    如果二者不等,最开始的时候堆大小是Xms,随着heap内存消耗,jvm很有可能需要申请更大的空间直到Xmx;每一次调整(gc)都需要一定的系统开销(jvm与os之间)。生产环境一般一台机器或者一个容器只有一个服务,所以可以二者相等

  2. 双重锁检查,单例

    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实现,可以实现乐观锁
  1. 自旋锁:可以认为是获取锁的一种方式。当线程发现资源被锁住后,此时不立刻挂起线程,而是通过一定时间内的自循环,来尝试获取锁。这可以少线程阻塞造成的线程切换,能得到较大的性能提升。

  2. synchronized 的优化,最初synchronized必然会引起的内核态与用户态切换、线程阻塞造成的线程切换(重量级锁)。现在synchronized有一个锁膨胀过程,即
    偏向锁->轻量级锁->重量级锁。

    • 轻量级锁:仅仅将Mark Word(对象头的一部分)中的部分字节CAS更新,如果更新成功,则获取成功;否则,发生了激烈锁竞争,膨胀为重量级锁。
      • 轻量级锁,不需要系统调用
      • 第一次失败后,可以通过自旋的方式在次尝试
    • 偏向锁:假定有且仅有第一个申请锁的线程会使用锁,因此,只需要在Mark Word中CAS记录,如果成功,则获取成功。否则,说明有其他线程竞争,膨胀为轻量级锁。
      • 偏向锁无法使用自旋锁优化,因为一旦有其他线程申请锁,如果自旋,就破坏了偏向锁的意义。
      • 轻量级锁每次申请、释放锁都至少需要一次CAS,但偏向锁只有初始化时需要一次CAS。
    • 偏向锁适用于无竞争的情况,轻量级锁适用于轻度竞争的情况,重量级锁适用于竞争激烈的情况
  3. 复制算法为什么有两块Survivor空间
    如果只有一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移到另一块,剩下的对象直接清理即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值