面试题--Java基础

1、什么是线程局部变量
线程局部变量是局限于线程内部的变量,属于一个线程自身独有,不参与到多个线程的共享。Java提供了 ThreadLocal 类来支持线程局部变量,这是一种实现线程安全的方式。另外,在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,应用就存在内存泄露的风险。

2、Java对象的sleep方法和wait方法的区别
两者都是用来暂停当前运行的线程,本质上的区别是 sleep 方法在暂停线程时,不会释放已持有的锁,而 wait 方法意味着条件等待,会释放掉持有的锁。
对于线程的状态,sleep 暂停时线程状态为:TIME_WAITING,wait暂停时状态为:WAITING

3、什么是不可变对象,Java 中如何创建一个不可变对象
不可变对象指对象一旦被创建,对象的状态就不能再被改变。任何修改都会创建一个新的对象,如 JDK 内置的 final 类 String,Integer 及其他包装类等。创建一个不可变对象可参照 String 类。

4、Java中可以强制转换Int类型到Byte类型,若该值大于Byte类型的范围,将会出现什么现象
Java中 int 是32位,Byte 是8位;所以在超出 Byte 类型范围后的强制转换,Int 类型的高24位将会被丢弃,Byte 类型值域是 -128 到 127。

5、a = a + b 和 a += b 的区别
+= 隐式的将加操作的结果类型 强制转换为 持有结果的类型。如果两个整型相加,如byte、short或int,首先会将它们提升到int类型,然后在执行加法操作。如果加法操作的结果比 a 的最大值要大,则 a + b 会出现编译错误,但是 a += b 则没问题,如下:

byte a = 127;
byte b = 127;
b = a + b;    // error : cannot convert from int to byte
b += a;       // ok

6、3 * 0.1 == 0.3 将会返回什么
false,因为有些浮点数不能被精确的表达出来。
3 * 0.1 = 0.30000000000000004

7、Serial 与 Parallel GC 之间的不同之处
Serial 与 Parallel 在GC执行期间都会触发 stop-the-world。
Serial 是 JVM 最基本的、发展历史最悠久的垃圾收集器,曾经在 JDK 1.3 之间是新生代收集的唯一选择。它是一个单线程的收集器,使用复制算法,最重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。虽然Serial缺点如此明显,但也有着优于其他收集器的地方:简单而高效;时至今日,从 Serial 到 CMS 再到 G1,Serial 依然是 JVM 运行在 Client 模式下的默认新生代收集器。
Parallel 全名是 Parallel Scavenge,它也是一个新生代收集器,它和 Serial 一样也是使用复制算法的收集器,且是一个并发的多线程收集器。该收集器的关注点与其他收集器不同,CMS等收集器的关注点是尽可能的缩短垃圾收集的时间,而 Parallel Scavenge 的特点是“吞吐量优先”:

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

例如:若虚拟机总运行时间为 100 分钟,其中垃圾收集时间花掉 1 分钟,则吞吐量为 99 %。

8、32 位 和 64 位的 JVM 中,Int 类型的长度是多少
Int 类型长度不变,都是 32 位 / 4 个字节。

9、Java 中 WeakReference 与 SoftReference 的区别
WeakReference 与 SoftReference 都有利于提高 GC 的回收效率优化内存,区别是 WeakReference 一旦失去最后一个强引用,就会被 GC 回收;而 SoftReference 虽然在失去最后一个强引用时,也会被 GC 回收,但是 SoftReference 延迟到内存不足的时候才会被回收。
附上 SoftReference 的缓存应用,能够在缓存内容过大时避免出现 OutOfMemory 问题

    // create object
    Operation opr = new Operation();

    // do something
    opr.doSomething();

    // cache it
    SoftReference<Operation> soft = new SoftReference<>(opr);

    // release opr
    opr = null;

    // ...

    // next time
    if (soft == null) // GC reclaimed it, reload object
        soft = new SoftReference<>(new Operation());

    // get object
    Operation nextOpr = soft.get();

    // continue do something
    nextOpr.doSomething();

10、JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?
当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU 缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM 主要动机在于可以指定最大堆大小,通过压缩 OOP 可以节省一定的内存。通过 -XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。

转载 HippoSystem

参考 《深入理解 Java 虚拟机》

猜你喜欢

转载自blog.csdn.net/a58YYXG/article/details/81301560