腾讯java面试答案整理

1.Java中锁的分类

  1. 乐观锁与悲观锁:
    (1)乐观锁 只会在更新数据的时候判断是否出现冲突,适合读操作多
    (2)悲观锁 每次拿数据都会上锁(比如synchronized),适合写操作多
  2. 共享锁和排他锁
    对于Java ReentrantLock而言,其是排他锁。但是对于Lock的另一个实现类ReadWriteLock,其读锁是共享锁,其写锁是排他锁。
  3. 可重入锁
    即同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁。
  4. 公平锁/非公平锁
    公平锁是指多个线程按照申请锁的顺序来获取锁,非公平锁不是。
  5. 偏向锁/轻量级锁/重量级锁
    (1)只有一个线程在访问时,为偏向锁。
    (2)当有另一个线程也请求这把锁,则会膨胀为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
    (3)当自旋时间过长,会进入阻塞,此时线程膨胀为重量级锁,会使其他请求该锁的线程阻塞。
  6. 自旋锁
    尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

2.jvm内存结构中,哪些是会发生内存溢出(OOM)的?

(1)虚拟机栈,虚拟机在动态扩展栈时无法申请到足够的内存空间。
(2)本地方法栈,也是一样。
(3)堆,如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。
(4)方法区,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

3.元空间和永久代的区别?

(1)元空间和永久代都是方法区的实现方式,在JDK1.8之前使用永久代,在1.8及以后使用元空间。
(2)存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的,而元空间属于本地内存,大小仅受本地内存限制。
(3)存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中。相当于永久代的数据被分到了堆和元空间中。
(4)元空间的优点:字符串存在永久代中,容易出现性能问题和内存溢出;类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出;永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

4.JDK1.8中HashMap的结构是怎么样的,为什么用红黑树?

JDK1.8中HashMap用的是数组+链表+红黑树,当链表超过一定长度,会转化为红黑树。
当链表过长时,查找一个元素所消耗的时间就很长,时间为O(n);如果用普通二叉搜索树,在最坏情况下会退化为O(n),如果用红黑树,会一直保持O(logn)的时间复杂度。

5.ConcurrentHashMap

相比于Hashtable,锁的粒度更加细化,通过分段锁,只锁住当前链表/红黑树的头结点,效率会更高,也能保证并发安全。

6.为什么要有双亲委派机制?如果是为了避免一个类多次加载为什么不直接用一个加载器?

(1)定义:当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器不能加载,自己才会去加载这个类。
(2)好处:可以避免重复加载同一个类。同时,最重要的,保证核心.class不能被篡改。即使自己在ClassPath中写了一个java.lang.Object也不会加载。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值