数据结构论坛

首页 » 分类 » 定义 » 技术干货JVM经典面试题集锦上
TUhjnbcbe - 2023/8/5 20:21:00

1.JVM参数主要有几种分类?

标准参数

标准参数,顾名思义,标准参数中包括功能以及输出的结果都是很稳定的,基本上不会随着JVM版本的变化而变化。标准参数以-开头,如:java-version、java-jar等,通过java-help可以查询所有的标准参数。

非标准参数

非标准参数以-X开头,是标准参数的扩展。对应前讲的标准化参数,这是非标准化参数。表示在将来的JVM版本中可能会发生改变,但是这类以-X开始的参数变化的较小。

不稳定参数

这是我们日常开发中接触到最多的参数类型。这也是标准化参数,相对来说不稳定,随着JVM版本的变化可能会发生变化,主要用于JVM调优和debug。

不稳定参数以-XX开头,此类参数的设置很容易引起JVM性能上的差异,使JVM存在极大的不稳定性。如果此类参数设置合理将大大提JVM的性能及稳定性。

不稳定参数分为三类:

性能参数:用于JVM的性能调优和内存分配控制,如内存大小的设置;

行为参数:用于改变JVM的基础行为,如GC的式和算法的选择;

调试参数:用于监控、打印、输出jvm的信息;

2.Java中会存在内存泄漏吗,简述一下。

理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。

3.Java中都有哪些引用类型?

强引用:发生gc的时候不会被回收。new。

软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。SoftReference

弱引用:有用但不是必须的对象,在下一次GC时会被回收。WeakReference

虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用的用途是在gc时返回一个通知。

4.在Java中,对象什么时候可以被垃圾回收?

首先先由可达性算法去判断对象是否可回收二次标记,相当于二次审判。finalize方法其次再去根据GC的回收机制,择时回收

5.StackOverflow异常有没有遇到过?一般你猜测会在什么情况下被触发?

栈内存溢出,一般由栈内存的局部变量过大,导致内存溢出。出现在递归方法,参数个数过多,递归过深,递归没有出口。

6.堆空间分哪个部分?以及如何设置各个部分大小?

Java堆被所有线程共享,在Java虚拟机启动时创建。是虚拟机管理最大的块内存。

Java堆是垃圾回收的主要区域,而且主要采用分代回收算法。堆进步划分主要是为了更好的回收内存或更快地分配内存。

Java虚拟机规范的描述是:所有的对象实例以及数组都要在堆上分配。堆内存空间在物理上可以不连续,逻辑上连续即可。

堆大小=新生代+年代。

堆的大小可通过参数–Xms(堆的初始容量)、-Xmx(堆的最大容量)来指定。

其中,新生代(Young)被细分为Eden和两个Survivor区域,这两个Survivor区域分别被命名为

from和to,以示区分。

默认的,Eden:from:to=8:1:1。(可以通过参数–XX:SurvivorRatio来设定。)即:Eden=8/10的新生代空间大小,from=to=1/10的新生代空间大小。

JVM每次只会使用Eden和其中的块Survivor区域来为对象服务,所以论什么时候,总是有块

Survivor区域是空闲着的。

新生代实际可用的内存空间为9/10(即90%)的新生代空间。

-Xmn:于这个参数则是对-XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize=-XX:MaxnewSize=-Xmn,虽然会很便,但需要注意的是这个参数是在JDK1.4版本以后才使用的。

7.什么是栈帧?栈帧存储了什么?

虚拟机栈也是线程私有,而且生命周期与线程相同,每个Java法在执的时候都会创建个栈帧(StackFrame)。栈帧(StackFrame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了法的局部变量表、操作数栈、动态连接和法返回地址等信息。每个法从调用至执行完成的过程,都对应一个栈帧在虚拟机栈从栈到出栈的过程。

8.如何设置参数生成GC日志?

设置JVM

GC格式日志的主要参数包括如下8个:

1.-XX:+PrintGC输出简要GC日志。

2.-XX:+PrintGCDetails输出详细GC日志。

3.-Xloggc:gc.log输出GC日志到件。

4.-XX:+PrintGCTimeStamps输出GC的时间戳(以JVM启动到当期的总时的时间戳形式)。

5.-XX:+PrintGCDateStamps输出GC的时间戳(以日期的形式,如-04-26T21:53:59.+)。

6.-XX:+PrintHeapAtGC在进GC的前后打印出堆的信息。

7.-verbose:gc:在JDK8中,-verbose:gc是-XX:+PrintGC个别称,日志格式等价与:-XX:+PrintGC。不过在JDK9中-XX:+PrintGC被标记为deprecated。

-verbose:gc是个标准的选项,-XX:+PrintGC是个实验的选项,建议使用-verbose:gc替代-XX:+PrintGC。

8.-XX:+PrintReferenceGC打印年轻代各个引用的数量以及时。

开启GC日志

多种法都能开启GC的日志功能,其中包括:使用-verbose:gc或-XX:+PrintGC这两个标志中的任意个能创建基本的GC日志(这两个日志标志实际上互为别名,默认情况下的GC日志功能是关闭的)使用XX:+PrintGCDetails标志会创建更详细的GC日志推荐使用-XX:+PrintGCDetails标志(这个标志默认情况下也是关闭的);通常情况下使用基本的GC日志很难诊断垃圾回收时发生的问题。

开启GC时间提示

除了使用详细的GC日志,我们还推荐使用-XX:+PrintGCTimeStamps或者-XX:+PrintGCDateStamps,便于我们更精确地判断次GC操作之间的时间。这两个参数之间的差别在于时间戳是相对于0(依据JVM启动的时间)的值,而日期戳(datestamp)是实际的日期字符串。由于日期戳需要进格式化,所以它的效率可能会受轻微的影响,不过这种操作并不频繁,它造成的影响也很难被我们感知。

指定GC日志路径

默认情况下GC日志直接输出到标准输出,不过使用-Xloggc:filename标志也能修改输出到某个件。除显式地使用-PrintGCDetails标志,否则使用-Xloggc会动地开启基本日志模式。使用日志循环(Logrotation)标志可以限制保存在GC日志中的数据量;对于需要时间运的服务器而,这是个常有用的标志,否则累积个的数据很可能会耗尽服务器的磁盘。

开启日志滚动输出

通过-XX:+UseGCLogfileRotation-XX:NumberOfGCLogfiles=N-XX:GCLogfileSize=N标志可以控制日志件的循环。默认情况下,UseGCLogfileRotation标志是关闭的。它负责打开或关闭GC日志滚动记录功能的。要求必须设置-Xloggc参数开启UseGCLogfileRotation标志后,默认的件数是0(意味着不作任何限制),默认的日志件大小是0(同样也是不作任何限制)。因此,为了让日志循环功能真正生效,我们必须为所有这些标志设定值。

需要注意的是:

Thesizeofthelogfileatwhichpointthelogwillberotated,mustbe=8K.设置滚动日志件的大小,必须大于8k。当前写日志件大小超过该参数值时,日志将写下个件设置滚动日志件的个数,必须大于等于1必须设置-Xloggc参数。

9.GC是什么?为什么要有GC?

GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉显示的垃圾回收调用。

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。

10.第3行中生成的object在第几行执行后成为garbagecollection的对象?

第7行。

(未完待续)

1
查看完整版本: 技术干货JVM经典面试题集锦上