文章目录
- 1、Java中会存在内存泄漏吗,请简单描述。
- 2、64位JVM中,int的长度是多数?
- 3、Serial与Parallel GC之间的不同之处?
- 4、32位和64位的JVM,int类型变量的长度是多数?
- 5、Java中WeakReference与SoftReference的区别?
- 6、JVM选项-XX:+UseCompressedOops有什么作用?为什么要使用?
- 7、怎样通过Java程序来判断JVM是32位还是64位?
- 8、32位JVM和64位JVM的最大堆内存分别是多数?
- 9、JRE、JDK、JVM及JIT之间有什么不同?
- 10、解释Java堆空间及GC?
- 11、JVM内存区域
- 12、程序计数器(线程私有)
- 13、虚拟机栈(线程私有)
- 14、本地方法区(线程私有)
- 15、你能保证GC执行吗?
- 16、怎么获取Java程序使用的内存?堆使用的百分比?
- 17、Java中堆和栈有什么区别?
- 18、描述一下JVM加载class文件的原理机制
- 19、GC是什么?为什么要有GC?
- 20、堆(Heap-线程共享)-运行时数据区
- 21、方法区/永久代(线程共享)
- 22、JVM运行时内存
- 23、新生代
- 24、老年代
- 25、永久代
- 26、JAVA8与元数据
- 27、引用计数法
- 28、可达性分析
- 29、标记清除算法(Mark-Sweep)
- 30、复制算法(copying)
- 31、标记整理算法(Mark-Compact)
- 32、分代收集算法
- 33、新生代与复制算法
- 34、老年代与标记复制算法
- 35、JAVA强引用
- 36、JAVA软引用
- 37、JAVA弱引用
- 38、JAVA虚引用
- 39、分代收集算法
- 40、在新生代-复制算法
- 41、在老年代-标记整理算法
- 42、分区收集算法
- 43、GC垃圾收集器
- 44、Serial垃圾收集器(单线程、 复制算法)
- 45、ParNew垃圾收集器(Serial+多线程)
- 46、Parallel Scavenge收集器(多线程复制算法、高效)
- 57、Serial Old收集器(单线程标记整理算法 )
- 58、Parallel Old收集器(多线程标记整理算法)
- 59、CMS收集器(多线程标记清除算法)
- 60、G1收集器
- 61、JVM类加载机制
- 62、类加载器
- 63、双亲委派
- 64、OSGI(动态模型系统)
- 65、动态改变构造
- 66、模块化编程与热插拔
- 67、JVM内存模型
- 68、栈
- 69、本地方法栈
- 70、程序计数器
- 71、堆
- 72、方法区
- 73、分代回收
- 74、堆和栈的区别
- 75、什么时候会触发FullGC
- 76、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
- 77、对象分配规则
- 78、描述一下JVM加载class文件的原理机制?
- 79、Java对象创建过程
- 80、简述Java的对象结构
- 81、如何判断对象可以被回收
- 82、JVM的永久代中会发生垃圾回收么
- 83、垃圾收集算法
- 84、调优命令有哪些?
- 85、调优工具
- 86、Minor GC与Full GC分别在什么时候发生?
- 87、你知道哪些JVM性能调优
- 总结
最近面试的小伙伴很多,对此我整理了一份Java面试题手册:基础知识、JavaOOP、Java集合/泛型面试题、Java异常面试题、Java中的IO与NIO面试题、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、SpringBoot、SpringCloud、RabbitMQ、Dubbo、MyBatis、ZooKeeper、数据结构、算法、Elasticsearch、Kafka、微服务、Linux等等。可以分享给大家学习。【持续更新中】
完整版Java面试题地址:【2021最新版】Java面试真题汇总
序号 | 内容 |
1 | 【2021最新版】JavaOOP面试题总结 |
2 | 【2021最新版】Java基础面试题总结 |
3 | 【2021最新版】多线程&并发面试题总结 |
4 | 【2021最新版】Mysql面试题总结 |
5 | 【2021最新版】Redis面试题总结 |
6 | 【2021最新版】Memcached面试题总结 |
7 | 【2021最新版】MongoDB面试题总结 |
8 | 【2021最新版】Spring面试题总结 |
9 | 【2021最新版】Spring Boot面试题总结 |
10 | 【2021最新版】Spring Cloud面试题总结 |
11 | 【2021最新版】RabbitMQ面试题总结 |
12 | 【2021最新版】Dubbo面试题总结 |
13 | 【2021最新版】MyBatis面试题总结 |
14 | 【2021最新版】ZooKeeper面试题总结 |
15 | 【2021最新版】数据结构面试题总结 |
16 | 【2021最新版】算法面试题总结 |
17 | 【2021最新版】Elasticsearch面试题总结 |
18 | 【2021最新版】Kafka面试题总结 |
19 | 【2021最新版】微服务面试题总结 |
20 | 【2021最新版】Linux面试题总结 |
1、Java中会存在内存泄漏吗,请简单描述。
答:
会,自己实现堆载的数据结构时有可能会出现内存泄露,可参看effective java。
2、64位JVM中,int的长度是多数?
3、Serial与Parallel GC之间的不同之处?
4、32位和64位的JVM,int类型变量的长度是多数?
答:
32位和64位的JVM中,int类型变量的长度是相同的,都是32位或者4个字节。
5、Java中WeakReference与SoftReference的区别?
6、JVM选项-XX:+UseCompressedOops有什么作用?为什么要使用?
7、怎样通过Java程序来判断JVM是32位还是64位?
8、32位JVM和64位JVM的最大堆内存分别是多数?
9、JRE、JDK、JVM及JIT之间有什么不同?
10、解释Java堆空间及GC?
11、JVM内存区域
答:
JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA堆、方法区】、直接内存。
线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在Hotspot VM内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。
线程共享区域随虚拟机的启动/关闭而创建/销毁。
直接内存并不是JVM运行时数据区的一部分, 但也会被频繁的使用:在JDK1.4引入的NIO提供了基于Channel与Buffer的IO方式, 它可以使用Native函数库直接分配堆外内存, 然后使用DirectByteBuffer对象作为这块内存的引用进行操作(详见:Java I/O扩展), 这样就避免了在Java堆和Native堆中来回复制数据, 因此在一些场景中可以显著提高性能。
12、程序计数器(线程私有)
答:
一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有” 的内存。
正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址) 。如果还是Native方法,则为空。
这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。
13、虚拟机栈(线程私有)
答:
是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
栈帧( Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、 方法返回值和异常分派(Dispatch Exception)。 栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。
14、本地方法区(线程私有)
答:
不能,虽然你可以调用System.gc() 或者Runtime.gc(),但是没有办法保证GC的执行。
15、你能保证GC执行吗?
16、怎么获取Java程序使用的内存?堆使用的百分比?
答:
可以通过java.lang.Runtime类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。
17、Java中堆和栈有什么区别?
18、描述一下JVM加载class文件的原理机制
19、GC是什么?为什么要有GC?
答:
GC是垃圾收集的意思 ,内存处理是编程人员容易出现问题的地方 ,忘记或者错误的内存回收会导致程序 或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否 超过作用域从而达到自动回收内存的目的 ,Java语言没有提供释放已分配内存的显示操作方法 。Java程序员不用担心内存管理, 因为垃圾收集器会自动进行管理 。要请求垃圾收集 ,可以调用下面的方法之一 :System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用 。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。
20、堆(Heap-线程共享)-运行时数据区
21、方法区/永久代(线程共享)
22、JVM运行时内存
答:
Java堆从GC的角度还可以细分为:新生代(Eden 区、From Survivor区和To Survivor区)和老年代
23、新生代
24、老年代
25、永久代
26、JAVA8与元数据
27、引用计数法
28、可达性分析
29、标记清除算法(Mark-Sweep)
答:
最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。
如图
从图中我们就可以发现,该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可利用空间的问题。
30、复制算法(copying)
答:
为了解决 Mark-Sweep 算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。
如图:
这种算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原本的一半。且存活对象增多的话, Copying算法的效率会大大降低。
31、标记整理算法(Mark-Compact)
答:
结合了以上两个算法,为了避免缺陷而提出。标记阶段和 Mark-Sweep 算法相同, 标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。
如图
32、分代收集算法
33、新生代与复制算法
答:
目前大部分JVM 的 GC对于新生代都采取Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,即要复制的操作比较少,但通常并不是按照1: 1来划分新生代。一般将新生代划分为一块较大的Eden空间和两个较小的Survivor空间(From Space, To Space),每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将该两块空间中还存活的对象复制到另一块Survivor空间中。
34、老年代与标记复制算法
35、JAVA强引用
36、JAVA软引用
37、JAVA弱引用
38、JAVA虚引用
39、分代收集算法
40、在新生代-复制算法
41、在老年代-标记整理算法
42、分区收集算法
43、GC垃圾收集器
答:
Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法;年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器, JDK1.6中Sun HotSpot虚拟机的垃圾收集器如下:
44、Serial垃圾收集器(单线程、 复制算法)
45、ParNew垃圾收集器(Serial+多线程)
46、Parallel Scavenge收集器(多线程复制算法、高效)
57、Serial Old收集器(单线程标记整理算法 )
答:
Serial Old是Serial垃圾收集器年老代版本,它同样是个单线程的收集器,使用标记-整理算法,这个收集器也主要是运行在 Client默认的java虚拟机默认的年老代垃圾收集器。在Server模式下,主要有两个用途:
在 JDK1.5 之前版本中与新生代的Parallel Scavenge收集器搭配使用。
作为年老代中使用CMS收集器的后备垃圾收集方案。新生代 Serial 与年老代 Serial Old 搭配垃圾收集过程图:
新生代Parallel Scavenge收集器与ParNew收集器工作原理类似,都是多线程的收集器,都使用的是复制算法,在垃圾收集过程中都需要暂停所有的工作线程。新生代ParallelScavenge/ParNew与年老代Serial Old搭配垃圾收集过程图:
58、Parallel Old收集器(多线程标记整理算法)
59、CMS收集器(多线程标记清除算法)
60、G1收集器
61、JVM类加载机制
62、类加载器
答:
虚拟机设计团队把加载动作放到JVM外部实现,以便让应用程序决定如何获取所需的类,JVM提供了3 种类加载器:
启动类加载器(Bootstrap ClassLoader) 负责加载JAVA_HOME\lib目录中的,或通过-Xbootclasspath参数指定路径中的,且被虚拟机认可(按文件名识别, 如 rt.jar)的类。
扩展类加载器(Extension ClassLoader)负责加载 JAVA_HOME\lib\ext 目录中的,或通过java.ext.dirs系统变量指定路径中的类库。应用程序类加载器(Application ClassLoader):
负责加载用户路径(classpath)上的类库。JVM 通过双亲委派模型进行类的加载, 当然我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器。
63、双亲委派
64、OSGI(动态模型系统)
65、动态改变构造
66、模块化编程与热插拔
67、JVM内存模型
68、栈
69、本地方法栈
70、程序计数器
71、堆
72、方法区
73、分代回收
答:
分代回收基于两个事实:大部分对象很快就不使用了,还有一部分不会立即无用,但也不会持续很长时间
年轻代->标记-复制
老年代->标记-清除
74、堆和栈的区别
75、什么时候会触发FullGC
76、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
77、对象分配规则
78、描述一下JVM加载class文件的原理机制?
79、Java对象创建过程
80、简述Java的对象结构
81、如何判断对象可以被回收
82、JVM的永久代中会发生垃圾回收么
83、垃圾收集算法
84、调优命令有哪些?
85、调优工具
86、Minor GC与Full GC分别在什么时候发生?
87、你知道哪些JVM性能调优
答:
设定堆内存大小-Xmx:堆内存最大限制。
设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代
-XX:NewSize:新生代大小
-XX:NewRatio 新生代和老生代占比
-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC
总结
该面试题答案解析完整文档获取方式:JVM面试题总结
篇幅有限,其他内容就不在这里一 一展示了,整理不易,欢迎大家一起交流,喜欢小编分享的文章记得关注我点赞哟,感谢支持!重要的事情说三遍,转发+转发+转发,一定要记得转发哦!!!