java面试题整理(一)

1.关于volatile关键字

java内存模型中的原子性,可见性,有序性

可见性

通常情况下,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情,可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。通俗来说,就是一个线程修改的结果,另一个线程马上就可以看到,

在java中 volatile,synchronized,final都可以实现可见性

原子性

比如a=0(a必须是非long和double类型)这个操作时不可分割的,那么我们说这个操作是原子操作,在比如,a++,是可以分割的,所以它不是一个原子操作。非原子操作都会存在线程安全的问题,需要我们使用同步技术来让它变成一个原子操作,一个操作是原子操作,我们就说它具有原子性,

有序性

volatile和synchronized两个关键字来保证线程之间操作的有序性,volatile禁止指令重排序,synchronized保证一个变量在同一时刻只允许一条线程对其进行lock操作,持有同一个对象锁的两个同步快只能串行执行。

2.JVM中垃圾回收算法

具体的方法有以下几种

1.标记-清除

2.标记-整理

3.分代回收

1)标记-清除算法

算法分为两个过程:1)标记正所有需要回收的对象 2)标记完成后清除被标记的对象

其标记的过程就是判断对象有效性,执行可达性分析的过程。

2)标记-复制算法

它将可用内存划分为两个等量的区域,每次只使用一块,当正在使用的区域需要进行垃圾回收时,存活的对象将被复制到另外一块区域。

3)标记-整理算法

4)分代回收算法

对象的生存周期总体可分为三种:新生代,老年代,永久代

比如新生代的对象在每次垃圾时都会有大量的对象死去,只有很少一部分存活,那就可以选择标记-复制算法。而是将新生代细分为了一块较大的Eden加上其中一块survivor区域,对于老年代来说,大部分对象都处于存活的状态,同时,如果一个大对象要在该区域进行分配,而内存空间又不足,这个时候就需要使用标记-清除算法或者是标记-整理算法

如何判断一个对象是否应该被回收

这个问题就是判断对象是否存活性判断,有两种方法

1.引用计数法

2.对象可达性分析

3.数据类型相关

java中基本类型所占字节

类型 位数 字节数

short 2 16

int 4 32

long 8 64

float 4 32

double 8 64

char 2 16

 

64为的JVM中,int的长度是多少

32,与平台是无关的

 

什么是编译器常量,使用它有什么风险

 

编译期常量指的就是程序在编译时就能确定这个常量的具体值

非编译器常量就是程序在运行时才能确定常量的值,因此也被称为运行时常量

你可能感兴趣的:(java)