java并发面试题vol.1

  1. 说一个最熟悉的垃圾回收算法
  2. 吞吐量优先和响应时间优先的回收器有哪些
  3. 怎么判断内存泄漏
  4. 为什么压缩指针超过32G失效
    为什么压缩指针超过32G失效
    对象头
    32位系统,占用 8 字节(markWord4字节+kclass4字节)
    64位系统,开启 UseCompressedOops**(压缩指针)时,占用 12 字节**,否则是16字节(markWord8字节+kclass8字节,开启时markWord8字节+kclass4字节)
    实例数据
    boolean 1
    byte 1
    short 2
    char 2
    int 4
    float 4
    long 8
    double 8
    引用类型
    32位系统占4字节 (因为此引用类型要去方法区中找类信息,所以地址为32位即4字节同理64位是8字节)
    64位系统,开启 UseCompressedOops时,占用4字节否则是8字节
    对齐填充
    如果对象头+实例数据的值不是8的倍数,那么会补上一些,补够8的倍数
    好了开始举例
    假设有一个对象
				class A{
					int a;//基本类型
					B b;//引用类型
				}

32位操作系统 花费的内存空间为
对象头-8字节 + 实例数据 int类型-4字节 + 引用类型-4字节+补充0字节(16是8的倍数) 16个字节
64位操作系统
对象头-16字节 + 实例数据 int类型-4字节 + 引用类型-8字节+补充4字节(28不是8的倍数补充4字节到达32字节) 32个字节
同样的对象需要将近两倍的容量,(实际平均1.5倍),所以需要开启压缩指针:
64位开启压缩指针 对象头-12字节 + 实例数据 int类型-4字节 + 引用类型-4字节+补充0字节=24个字节
开启后可以减缓堆空间的压力(同样的内存更不容易发生oom)

  1. 什么是内存泄漏?GC调优有经验吗?一般出现GC问题你怎么解决?
  2. 讲一下CMS的流程
  3. Threadlocal有没有内存泄漏问题
  4. G1两个Region不是连续的,而且之间还有可达的引用,我现在要回收一个,另一个怎么处理?
  5. 讲一下JVM堆内存管理(对象分配过程)
  6. 听说过CMS的并发预处理和并发可中断预处理吗
    到底多大的对象会被直接扔到老年大
    通过设置-XX:PretrnureSizeThreshold参数,大于这个参数直接进入老年代,目前只对Serial和ParNew有效
  7. 什么叫this逃逸?
    并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了
    这是危及到线程安全的,因为其他线程有可能通过这个逸出的引用访问到“初始化了一半”的对象(partially-constructed object)。
    这样就会出现某些线程中看到该对象的状态是没初始化完的状态,而在另外一些线程看到的却是已经初始化完的状态,
    这种不一致性是不确定的,程序也会因此而产生一些无法预知的并发错误。

你可能感兴趣的:(面试,并发)