Skip to content

1、线程池四种创建方式?

Java通过Executors(jdk1.5并发包)提供四种线程池,分别为:

1、 newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

2、 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

3、 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

4、 newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

2、什么是程序计数器

当前线程所执行的行号指示器。是 JVM 内存区域最小的一块区域。执行字节码工作时就是利用程序计数器来选取下一条需要执行的字节码指令。

3、Thread 类中的 yield 方法有什么作用?

使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。

当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可能是当前线程,也可能是其他线程,看系统的分配了。

4、老年代

1、 主要存放应用程序中生命周期长的内存对象。

2、 老年代的对象比较稳定,所以 MajorGC 不会频繁执行。在进行 MajorGC 前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。

3、 MajorGC 采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。ajorGC 的耗时比较长,因为要扫描再回收。MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候,就会抛出 OOM(Out of Memory)异常。

5、你知道哪些JVM性能调优

设定堆内存大小

1、 -Xmx:堆内存最大限制。设定新生代大小。新生代不宜太小,否则会有大量对象涌入老年代

2、 -XX:NewSize:新生代大小

3、 -XX:NewRatio 新生代和老生代占比

4、 -XX:SurvivorRatio:伊甸园空间和幸存者空间的占比

5、 设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

6、说说线程栈

这里的线程栈应该指的是虚拟机栈吧...

1、 JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。

2、 当方法调用的时候,会生成一个栈帧。栈帧是保存在虚拟机栈中的,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息

3、 线程运行过程中,只有一个栈帧是处于活跃状态,称为“当前活跃栈帧”,当前活动栈帧始终是虚拟机栈的栈顶元素。

4、 通过jstack工具查看线程状态

7、请解释StackOverflowError和OutOfMemeryError的区别?

通过之前的分析可以发现,实际上每一块内存中都会存在有一部分的可变伸缩区,其基本流程为:如果空间内存不足,在可变范围之内扩大内存空间,当一段时间之后发现内存充足,会缩小内存空间。

永久代(JDK 1.8后消失了)

虽然java的版本是JDK1.8,但是java EE 的版本还是jdk1.7,永久代存在于堆内存之中

元空间

元空间在Jdk1.8之后才有的,器功能实际上和永久代没区别,唯一的区别在于永久代使用的是JVM的堆内存空间,元空间使用的是物理内存,所以元空间的大小受本地内存影响,一般默认在2M 左右。

范例:设置一些参数,让元空间出错

Java -XX:MetaspaceSize=1m

8、运行时栈帧包含哪些结构?

1、 局部变量表

2、 操作数栈

3、 动态连接

4、 返回地址

5、 附加信息

9、MinorGC,MajorGC、FullGC都什么时候发生?

MinorGC在年轻代空间不足的时候发生,MajorGC指的是老年代的GC,出现MajorGC一般经常伴有MinorGC。

FullGC有三种情况。

1、 当老年代无法再分配内存的时候

2、 元空间不足的时候

3、 显示调用System.gc的时候。另外,像CMS一类的垃圾回收器,在MinorGC出现promotion failure的时候也会发生FullGC

10、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

在 java 虚拟机中,监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

一旦方法或者代码块被 synchronized 修饰,那么这个部分就放入了监视器的监视区域,确保一次只能有一个线程执行该部分的代码,线程在获取锁之前不允许执行该部分的代码

另外 java 还提供了显式监视器( Lock )和隐式监视器( synchronized )两种锁方案

11、JAVA8 与元数据

12、线程之间如何通信及线程之间如何同步

13、创建线程的三种方式的对比?

14、详细介绍一下JVM内存模型

15、多线程的好处

16、什么是happen-before原则?

17、精确来说的话的话:

18、有哪些类加载器?

19、什么是Future?

20、代码示例

21、分配CPU和IO密集:

22、Java中用到的线程调度算法是什么?

23、什么是Daemon线程?它有什么意义?

24、Serial 与 Parallel GC 之间的不同之处?

25、如何停止一个正在运行的线程?

26、你知道哪些GC类型?

27、为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

28、java中有几种方法可以实现一个线程?

29、为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?

30、说一下 synchronized 底层实现原理?

31、Tomcat是怎么打破双亲委派机制的呢?

用心去做高质量的内容网站,欢迎 star ⭐ 让更多人发现