Java并发编程面试精华:GC日志与Executor解析
需积分: 5 103 浏览量
更新于2024-08-03
1
收藏 9KB MD 举报
"并发编程最新面试题,常见面试题及答案汇总"
在Java并发编程领域,面试时常会涉及一些核心概念和技术。以下是两道典型的面试题及其答案:
### 1、如何开启和查看GC日志?
Java虚拟机(JVM)的垃圾收集(GC)日志是诊断和优化内存性能的关键工具。以下是一些常用的JVM参数来开启和定制GC日志:
- `-Xloggc:filename`:指定GC日志输出的文件路径。
- `-XX:+PrintGC`:开启打印GC的基本信息。
- `-XX:+PrintGCDetails`:打印详细的GC信息,包括每一代(如年轻代、老年代)的内存分配和回收。
- `-XX:+PrintGCTimeStamps`:添加时间戳到GC日志中,以便了解GC发生的具体时间。
- `-XX:+PrintGCDateStamps`:在日志中打印日期和时间,便于理解GC发生的绝对时间。
- `-XX:+PrintHeapAtGC`:在每次GC前后显示堆、方法区(Java 8以前)或元空间(Java 8及以后)的容量变化。
- `-XX:+PrintTenuringDistribution`:展示熬过垃圾收集的对象年龄分布,对调整`MaxTenuringThreshold`参数有帮助。
- `-XX:+PrintAdaptiveSizePolicy`:打印有关自动调整堆空间大小和收集目标的信息。
- `-XX:+PrintGCApplicationConcurrentTime`:记录GC期间用户线程的并发时间。
- `-XX:+PrintGCApplicationStoppedTime`:记录GC期间用户线程的停止时间。
- `-XX:+HeapDumpOnOutOfMemoryError`:在出现`OutOfMemoryError`时自动导出堆转储文件。
- `-XX:HeapDumpPath`:设置堆转储文件的保存路径。
Java 9及更高版本的JVM对日志模块进行了重构,参数格式有所变化。GC日志的格式可以根据这些参数的设定有所不同。分析GC日志时,可以通过工具进行可视化,如在线工具GCeasy或离线工具GCViewer。在没有这些工具的情况下,可以使用JDK自带的`jstat`命令行工具监控和分析GC情况。
### 2、在Java中Executor和Executors的区别?
在Java并发编程中,`Executor`和`Executors`扮演着不同的角色:
1. `Executor`是一个接口,它是执行线程任务的基础。它定义了启动和管理线程的核心方法,如`execute()`,但不提供创建线程池的直接方式。
2. `Executors`是一个工厂类,提供了多种静态方法用于根据实际需求创建不同类型的线程池,如单线程池、固定大小线程池、缓存线程池和定长线程池。这些线程池各有特点,适用于不同的并发场景。
3. `ExecutorService`接口继承自`Executor`,并添加了更多管理线程池的方法,如`submit()`、`shutdown()`和`awaitTermination()`,这些方法允许我们控制线程池的生命周期,并获取任务执行的状态和结果。
理解这两个概念的区别有助于在实际开发中选择合适的线程池类型,以实现高效、可控的并发执行。
通过掌握这些面试题涉及的知识点,开发者可以更好地理解和应对Java并发编程中的挑战,提升程序的性能和稳定性。