【2021】常问JVM面试题之第一篇

【基础】常问JVM面试题

JAVA上天入地篇之入地基础。

JVM常问的面试题精选

  1. 介绍下JAVA内存区域/运行时数据区
JAVA内存区域:分为私有区域、线程共享区、直接内存。
(1)私有区域:PC、虚拟机栈(VM Stack)、本地方法区
PC:指向虚拟机字节码指令的位置,唯一一个无OOM的区域
VM Stack:虚拟机栈和线程的生命周期相同。一个线程中,每调用一个方法创建一个栈帧(Stack Frame)

(2)线程共享域:JAVA堆、方法区

(3)直接内存-不受JVM GC管理

  1. JVM如何调优以及常见的异常报错解决方案
(1)java heap space(堆)  一般发生在启动阶段。
JVM在启动的时候会自动设置JVM Heap的值,可以利用JVM提供的-Xmn -Xms -Xmx等选项的值。
Heap的大小是Young Generation和Tenured Generaton之和。
原因:JVM中如果98%用于GC,且可用的Heap size不足2%时会抛出该异常信息。
解决方法:手动设置JVM heap的大小。三个参数。

(2)PerGem spcae(内存的永久保存区域) 一般发生在启动阶段。
原因:這块内存的class与Meta信息放太多,Class在被Load的时候被放入PermGen space区域,它和Instance的
Heap区域不同,sun的GC不会在程序运行期间对PermGen space进行清理,所以加载了很多的Class,就导致PermGen 
space 溢出。
解决方法:通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可。

(3)Thread Stack space(栈)
原因:JVM依然采用VM Stack,函数的调用过程都体现在堆栈和退栈上了。调用的构造函数的“层”太多了,
以致于把栈溢出了。通常栈区远小于堆区。通常的栈的大小是1-2MB。通俗一点就是单线程的程序需要的内存太大了。
通常的递归也不要层次太多,很容易溢出/
解决方法:1.修改程序 2.通过-Xss:来设置每个线程的Stack大小。

1'StackOverflowError异常
每当JAVA程序启动一个新的线程时,JVM都会给它分配一个新的java栈,java栈是以帧为单位来保存线程的运行状态。
当线程调用JAVA方法时,JVM压入一个新的栈帧到该线程的java栈中。只要這个方法还没有返回,就以它就会一直存在。
如果线程的方法嵌套调用层次太多(如递归调用),随着java栈中的帧逐渐增多,最终该线程的java栈中所有的栈帧大小大于
-Xss设置的值。
2’OutofMemoryError异常
JAVA程序启动一个新的线程时,没有足够的内存空间为该线程分配java栈(一个线程java栈的大小由-Xss参数确定)

3.说一下IO/NIO区别,如何解决IO阻塞问题?

(1)IO:
传统的IO对字节流和字符流操作。
(2)NIO:三大核心,分别是Channel(通道)、Buffer(缓冲区)、Selector(选择区)。
NIO对通道和缓冲区进行操作,数据总是从通道读取到缓冲区中,再从缓冲区中读取到通道中。
选择区用于监听多个通道的事件(比如连接打开、数据到达)。因此,单个线程可以监听多个数据通道。
(3)区别:最大的区别是IO是面向流的,NIO是面向缓冲区的。
(4)如何解决IO阻塞问题:最好结合实际讲例子。面试官喜欢听应用场景。
  1. jvm类加载机制,类加载器有哪些?
(1)类加载机制:五部分:加载,验证,准备,解析,初始化。
(2)类加载器:Bootstrap(启动类) 、Extension(扩展类)、Application(应用程序类)

Bootstrap(启动类) :JAVA_HOME\lib目录中的,或-Xbootclasspath参数指定路径中国、的,且被JVM
认可的类。(如rt.jar)

Extension(扩展类):JAVA_HOME\lib\ext,或通过java.ext.dirs系统变量指定路径中的类库。

Application(应用程序类):负责加载用户路径上的类库。jvm双亲委派模型进行类的加载,当然也可以
通过继承java.lang.ClasswLoader实现自定义的类加载器。
  1. 讲一下JVM强软弱虚引用?
(1)强引用:java中用的比较多的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。它处于可达状态的时候,是不能被垃圾回收机制回收的。就是说该对象以后永远也用不到了也不会被回收。这个也就是造成java内存泄露的主要原因之一。
【宁愿抛出OutOfMemoryErro也不去清理】

(2)软引用:softReference类,当内存足够时是不会被回收的,不够的时候就垃圾回收机制一运行就会被回收。可以调用ReferenceQueue的poll()方法,检查是否存在与它有关联的对象被回收:如果队列为空,返回Null;否则返回队列中队首的一个Reference对象。
【在抛出OutOfMemoryErro之前清理软引用对象】

(3)弱引用:weakReference类,垃圾回收机制一运行就会被回收。不管jvm的内存空间是否足够。弱引用可以和队列一起使用,如果弱引用的对象有被回收的,那么会把这弱引用加到与之相关的引用队列中去。
虚引用:PhantomReference类,不能单独使用,必须和队列一起使用。主要作用是它用来跟踪被垃圾回收的对象的状态。当垃圾回收在回收对象时,当发现还有虚引用对象时,会把虚引用加到与之相关的引用队列中去。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值