欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Java面试题库——JVM

Java面试题库——JVM

2024/10/23 14:10:18 来源:https://blog.csdn.net/qq_58193440/article/details/143081215  浏览:    关键词:Java面试题库——JVM

1.说一下 jvm 的主要组成部分?及其作用?

类加载器(ClassLoader),运行时数据区(Runtime Data Area),执行引擎(Execution Engine),本地库连接(Native Interface)
组件的作用:首先通过类加载器把Java代码转换成字节码,运行时数据区再把字节码加载到内存中,而字节码只是JVM的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎,将字节码翻译成底层系统指令,再交由CPU去执行,而这个过程需要调用其它语言的本地库连续来实现整个程序的功能。

2.说一下 jvm 运行时数据区域?

运行时区域包括:程序计时器、虚拟机栈、本地方法栈、堆(创建的对象)、方法区(雷达属性、成员变量、构造函数等)
有的区域随着虚拟机进程的启动而存在,有点区域则依赖用户进程的启动和结束而创建和销毁。

3.堆栈的区别

栈内存是由系统自动分配的,存储的是局部变量;堆内存是人为申请开辟的,存储的是实体。
栈空间小,连续,速度快;堆空间大,不连续,速度慢。
栈内存存放的变量生命周期一旦结束就会被释放;堆内存存放的实体会被垃圾回收机制不定时的回收。

4.队列和栈是什么?有什么区别?

队列和栈都是被用来预存储数据的;
队列允许先进先出检索元素;栈是对元素后进先出的检索。

5.什么是类加载机制?

类的加载(Class Loading)是指将类的字节码文件(.class文件)加载到内存中,并在内存中创建对应的类对象的过程。

6.类加载的步骤有哪些?

加载:根据查找路径找到相应的class文件然后导入;
检查:检查加载的class文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标识,而直接引用指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。

7.什么是类加载器?

类加载器是负责将class文件加载到内存中。并为其生成对应的java.lang.class对象。一旦一个类被载入JVM了,同一个类就不会被再次加载。那么怎样才算是同一个类?在JAVA中一个类用其全限定类名(包名和类名)作为其唯一标识,但是在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。每一个类加载器,都有一个独立的类名称空间。也就是说,在JAVA中的同一个类,如果用不同的类加载器加载,则生成的class对象认为是不同的。

8.类加载器的种类有哪些?

启动类加载器(BootstrapClassLoader):是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,启动类加载器无法被应用程序直接使用
扩展类加载器(Extension ClassLoader):该加载器器是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。
系统类加载器(App ClassLoader):系统类加载器,也称为应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。

9.什么是双亲委派模型?

如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父加载器去完成,每一层的类加载器都是如此,这样所有的类加载请求都会被传送到顶层的启动类加载器中,只有当父加载器无法完成加载请求时,子加载器才会尝试去加载类。

10.怎么判断对象是否可以被回收?

引用计数器:为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数器-1,当计数器为0时就可以被回收。它有一个缺点不能解决循环引用的问题;
可达性分析:从GC Roots开始向下搜索,搜索所走过的路径被称为引用链。当对象GC Roots没有任何链相连接时,则证明此对象可以被回收。

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

强引用:默认的引用类型。只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null。
软引用:软引用用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
弱引用:弱引用的引用强度比软引用更弱一些,无论内存是否足够,只要JVM开始进行垃圾回收,那些被弱引用关联的对象都会被回收。
虚引用:虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能被回收。

12.说一下 jvm 有哪些垃圾回收算法?

标记-清除算法:只回收,不整理
标记-整理算法:是标记-清除算法的优化,解决了内存碎片的问题
复制算法:解决内存碎片
分代回收算法(常用):年轻代以复制为主,老年代以标记-整理为主

13.说一下 jvm 有哪些垃圾回收器?

垃圾回收器使用算法线程支持新生代/老年代
Serial复制单线程新生代
Serial Old标记-整理单线程老年代
ParNew复制多线程新生代
Parallel Scavenge复制多线程新生代
Parallel Old标记-整理多线程老年代
CMS标记-清除多线程老年代
G1标记-整理多线程整堆

14.详细介绍一下 CMS 垃圾回收器?

CMS是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种算法就非常合适。在启动JVM的参数加上“-XX:+UseConcMarkSweepGC”来指定使用CMS垃圾回收器。
CMS使用的是标记-清除算法,所以在gc时会产生大量的内存碎片,当剩余内存不满足程序运行要求时,系统将会出现Concurrent Mode Failure,临时CMS会采用Serial Old回收器进行垃圾清除,此时的性能会被降低。

15.新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?

新生代回收器:Serial、Parnew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old,CMS
整堆回收器:G1
新生代垃圾回收器一般采用的是复制算法。复制算法的优点是效率高,缺点是内存利用率低;
老年代垃圾回收器一般采用的是标记-整理算法。

16.简述分代垃圾回收器怎么工作的

分代回收器有两个区:新生代和老年代
新生代默认空间1/3,老年代默认占比是2/3
新生代默认使用的是复制算法新生代里有 3 个分区:
- 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
- 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
- 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。
它们的默认占比是 8:1:1,它的执行流程如下:
把 Eden + From Survivor 存活的对象放入 To Survivor 区;
清空 Eden 和 From Survivor 分区;
From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor;
每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。
老年代当空间占用到达某个值之后就会触发全局垃圾回收,一般使用标记整理的执行算法。

17.说一下 jvm 调优的工具?

JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是jconsole和jvisualvm这两款视图监控工具。-jconsole:用于对JVM中的内存、线程和类等进行监控;-jvisualvm:JDK自带的全年分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc变化等。

18.常用的 jvm 调优的参数都有哪些?

与垃圾回收相关的 JVM 参数:
-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年轻代的大小
-XX:-DisableExplicitGC — 让 System.gc()不产生任何作用
-XX:+PrintGCDetails — 打印 GC 的细节
-XX:+PrintGCDateStamps — 打印 GC 操作的时间戳
-XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小
-XX:NewRatio — 可以设置老生代和新生代的比例
-XX:PrintTenuringDistribution — 设置每次新生代 GC 后输出幸存者乐园中对象年龄的
分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和
最大值
-XX:TargetSurvivorRatio:设置幸存区的目标使用率

19.内存溢出、内存泄露、GC的基本概念

内存溢出:OutOfMemory,是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemory异常。
内存泄漏:memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早被占光。说白了就是该内存空间使用完毕之后未回收。
gc:分为full 过程和minor gc(Young GC),当每一块区满的时候都会引发gc。

20.CG是什么?为什么要有CG?

GC 是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或 Runtime.getRuntime().gc() ,但 JVM 可以屏蔽掉显示的垃圾回收调用。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com