JVM面试真题总结(四)
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
列举常用的垃圾收集器,并简要说明其特点
Serial收集器
- 它是最基本的收集器,对于单核CPU或小容量内存的机器来说,Serial收集器是一个不错的选择。
- 它在进行垃圾收集时,会暂停所有的用户线程,直到垃圾收集结束。
- 因此,它也被称为
Stop-The-World
收集器。
- Serial收集器主要应用在客户端应用或轻负载的服务器上。
Parallel(并行)收集器:
- 它是一种多线程的垃圾收集器,主要设计用来在多核CPU的环境下提高垃圾收集的效率
- 但是在进行垃圾收集时,也会暂停所有的用户线程。
- Parallel收集器主要应用在多核或多CPU的服务器环境中。
CMS(Concurrent Mark Sweep)收集器:
- 它是一种以获取最短回收停顿时间为目标的收集器。
- CMS收集器采用了标记-清除算法,并且大部分工作都在用户线程运行的同时进行。
- 它主要应用在对响应时间要求严格的应用中,比如网页服务器、交互式应用等。
G1(Garbage-First)收集器:
- 它是一种面向服务器的垃圾收集器,主要应用在多核CPU和大内存的服务器环境中。
- G1收集器通过划分多个小区域来避免全局的
Stop-The-World
,并且可以预测垃圾收集的停顿时间
- 从而达到一个稳定的响应时间。
列举常用的JVM问题定位工具,并简要说明其用途
Java提供了一些强大的工具来帮助开发者定位和解决JVM问题。
以下是一些常用的JVM问题定位工具:
JConsole:
- 这是Java自带的一个图形化监控工具,可以提供关于堆内存使用、线程使用、类加载等多方面的信息。
VisualVM:
- 这个工具集成了多个JDK命令行工具,可以对运行在JVM上的Java应用进行故障排查和性能分析。
JProfiler:
- 这是一个商业性能分析工具,可以分析CPU使用、内存泄漏、线程死锁等问题。
JStack:
- 这是一个命令行工具,可以打印出给定Java进程ID或
core file
的Java堆栈信息,常用于定位线程问题。JMap:
- 这个命令行工具可以打印出堆内存的详细信息,包括Java堆和永久代的内存映射。
JHat:
- 这个工具可以分析heap dump文件,并提供一个HTTP/HTML服务器,通过网页浏览器查看分析结果。
MAT (Memory Analyzer Tool):
- 这是一个强大的内存分析工具,可以用于分析
heap dump
文件,帮助找出内存泄漏和高内存消耗的原因。
列举常用的JVM性能调优命令,并简要说明其用途
jps: 用于显示所有JVM 虚拟机进程
jstack: 用于查看JVM 虚拟机当前时刻的线程快照
jinfo :用于实时查看和调整虚拟机运行参数
jmap: 用于生成
heap dump
文件jhat: 用于与jmap 命令搭配使用,分析jmap 生成的 dump 文件
jstat:用于监视JVM 虚拟机运行时状态信息的命令
- 它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
定义内存泄漏?
内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,即使程序可能已经不再需要这部分内存。
- 这样,随着时间的推移,可用的内存会越来越少
- 最终可能导致系统资源耗尽,从而影响程序或系统的正常运行。
在Java等带有垃圾回收机制的语言中
- 内存泄漏通常是由于长期存在的对象持续引用了不再需要的对象
- 导致这些不再需要的对象无法被垃圾回收器回收。
例如,假设我们有一个全局的
HashMap
,我们不断地向其中添加数据,但是却忘记从中删除不再需要的数据。
- 即使这些不再需要的数据已经没有被其他部分的程序引用,但是由于它们被HashMap引用
- 所以垃圾回收器无法回收它们,这就造成了内存泄漏。
除此之外,内存泄漏还可能由于以下原因造成:
- 静态集合类:
- 如Java的
Vector,ArrayList
等,如果集合对象被设置为静态,那么在整个应用程序生命周期内都不会被清理。- 监听器:
- 没有被显式地移除的监听器,可能会引起内存泄漏。
- 内部类和外部模块都持有实例:
- 内部类如果持有外部实例的引用,可能会导致外部实例无法被正确回收。
- 常量池的引用:
- 常量池中的数据在整个JVM生命周期内存在,如果常量池中保存了大量的常量,也可能导致内存泄漏。