JAVA虚拟机面试题Word文档下载推荐.docx
- 文档编号:15329495
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:27
- 大小:675.44KB
JAVA虚拟机面试题Word文档下载推荐.docx
《JAVA虚拟机面试题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JAVA虚拟机面试题Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
•元数据(注解);
•引入Instrumentation。
JavaVersionSE6
•支持脚本语言;
•引入JDBC4.0API;
•引入JavaCompilerAPI;
•可插拔注解;
•增加对NativePKI(PublicKeyInfrastructure)、JavaGSS(GenericSecurityService)、Kerberos和LDAP(LightweightDirectoryAccessProtocol)的支持;
•继承WebServices;
•做了很多优化。
JavaVersionSE7
•switch语句块中允许以字符串作为分支条件;
•在创建泛型对象时应用类型推断;
•在一个语句块中捕获多种异常;
•支持动态语言;
•支持try-with-resources;
•引入JavaNIO.2开发包;
•数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
•钻石型语法;
•null值的自动处理。
Java8
•函数式接口
•Lambda表达式
•接口的增强
运行时数据区域包括哪些?
6.程序计数器
7.Java虚拟机栈
8.本地方法栈
9.Java堆
10.方法区
11.运行时常量池
12.直接内存
程序计数器(线程私有)
程序计数器(ProgramCounterRegister)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。
分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。
为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各线程之间的计数器互不影响,独立存储。
13.如果线程正在执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;
14.如果正在执行的是Native方法,这个计数器的值为空。
程序计数器是唯一一个没有规定任何OutOfMemoryError的区域。
Java虚拟机栈(线程私有)
Java虚拟机栈(JavaVirtualMachineStacks)是线程私有的,生命周期与线程相同。
虚拟机栈描述的是Java方法执行的内存模型:
每个方法被执行的时候都会创建一个栈帧(StackFrame),存储
15.局部变量表
16.操作栈
17.动态链接
18.方法出口
每一个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
这个区域有两种异常情况:
19.StackOverflowError:
线程请求的栈深度大于虚拟机所允许的深度
20.OutOfMemoryError:
虚拟机栈扩展到无法申请足够的内存时
本地方法栈(线程私有)
虚拟机栈为虚拟机执行Java方法(字节码)服务。
本地方法栈(NativeMethodStacks)为虚拟机使用到的Native方法服务。
Java堆(线程共享)
Java堆(JavaHeap)是Java虚拟机中内存最大的一块。
Java堆在虚拟机启动时创建,被所有线程共享。
作用:
存放对象实例。
垃圾收集器主要管理的就是Java堆。
Java堆在物理上可以不连续,只要逻辑上连续即可。
方法区(线程共享)
方法区(MethodArea)被所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
和Java堆一样,不需要连续的内存,可以选择固定的大小,更可以选择不实现垃圾收集。
运行时常量池
运行时常量池(RuntimeConstantPool)是方法区的一部分。
保存Class文件中的符号引用、翻译出来的直接引用。
运行时常量池可以在运行期间将新的常量放入池中。
Java中对象访问是如何进行的?
Objectobj=newObject();
对于上述最简单的访问,也会涉及到Java栈、Java堆、方法区这三个最重要内存区域。
Objectobj
如果出现在方法体中,则上述代码会反映到Java栈的本地变量表中,作为reference类型数据出现。
newObject()
反映到Java堆中,形成一块存储了Object类型所有对象实例数据值的内存。
Java堆中还包含对象类型数据的地址信息,这些类型数据存储在方法区中。
如何判断对象是否“死去”?
21.引用计数法
22.根搜索算法
什么是引用计数法?
给对象添加一个引用计数器,每当有一个地方引用它,计数器就+1,;
当引用失效时,计数器就-1;
任何时刻计数器都为0的对象就是不能再被使用的。
引用计数法的缺点?
很难解决对象之间的循环引用问题。
什么是根搜索算法?
通过一系列的名为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(ReferenceChain),当一个对象到GCRoots没有任何引用链相连(用图论的话来说就是从GCRoots到这个对象不可达)时,则证明此对象是不可用的。
Java的4种引用方式?
在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为
23.强引用StrongReference
24.软引用SoftReference
25.弱引用WeakReference
26.虚引用PhantomReference
强引用
代码中普遍存在的,像上述的引用。
只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。
软引用
用来描述一些还有用,但并非必须的对象。
软引用所关联的对象,有在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围,并进行第二次回收。
如果这次回收还是没有足够的内存,才会抛出内存异常。
提供了SoftReference类实现软引用。
弱引用
描述非必须的对象,强度比软引用更弱一些,被弱引用关联的对象,只能生存到下一次垃圾收集发生前。
当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
提供了WeakReference类来实现弱引用。
虚引用
一个对象是否有虚引用,完全不会对其生存时间够成影响,也无法通过虚引用来取得一个对象实例。
为一个对象关联虚引用的唯一目的,就是希望在这个对象被收集器回收时,收到一个系统通知。
提供了PhantomReference类来实现虚引用。
有哪些垃圾收集算法?
27.标记-清除算法
28.复制算法
29.标记-整理算法
30.分代收集算法
标记-清除算法(Mark-Sweep)
什么是标记-清除算法?
分为标记和清除两个阶段。
首先标记出所有需要回收的对象,在标记完成后统一回收被标记的对象。
有什么缺点?
\1.效率问题。
标记和清除过程的效率都不高。
\2.空间问题。
标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致,程序分配较大对象时无法找到足够的连续内存,不得不提前出发另一次垃圾收集动作。
复制算法(Copying)-新生代
将可用内存按容量划分为大小相等的两块,每次只使用其中一块。
当这一块的内存用完了,就将存活着的对象复制到另一块上面,然后再把已经使用过的内存空间一次清理掉。
优点?
复制算法使得每次都是针对其中的一块进行内存回收,内存分配时也不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
缺点?
将内存缩小为原来的一半。
在对象存活率较高时,需要执行较多的复制操作,效率会变低。
应用?
商业的虚拟机都采用复制算法来回收新生代。
因为新生代中的对象容易死亡,所以并不需要按照1:
1的比例划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间。
每次使用Eden和其中的一块Survivor。
当回收时,将Eden和Survivor中还存活的对象一次性拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。
Hotspot虚拟机默认Eden和Survivor的大小比例是8:
1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存是会被“浪费”的。
标记-整理算法(Mark-Compact)-老年代
标记过程仍然与“标记-清除”算法一样,但不是直接对可回收对象进行清理,而是让所有存活的对象向一端移动,然后直接清理掉边界以外的内存。
分代收集算法
根据对象的存活周期,将内存划分为几块。
一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点,采用最适当的收集算法。
•新生代:
每次垃圾收集时会有大批对象死去,只有少量存活,所以选择复制算法,只需要少量存活对象的复制成本就可以完成收集。
•老年代:
对象存活率高、没有额外空间对它进行分配担保,必须使用“标记-清理”或“标记-整理”算法进行回收。
MinorGC和FullGC有什么区别?
MinorGC:
新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多死亡频繁,所以MinorGC非常频繁,一般回收速度较快。
FullGC:
老年代GC,也叫MajorGC,速度一般比MinorGC慢10倍以上。
Java内存
为什么要将堆内存分区?
对于一个大型的系统,当创建的对象及方法变量比较多时,即堆内存中的对象比较多,如果逐一分析对象是否该回收,效率很低。
分区是为了进行模块化管理,管理不同的对象及变量,以提高JVM的执行效率。
堆内存分为哪几块?
31.YoungGenerationSpace新生区(也称新生代)
32.TenureGenerationSpace养老区(也称旧生代)
33.PermanentSpace永久存储区
内存分配有哪些原则?
34.对象优先分配在Eden
35.大对象直接进入老年代
36.长期存活的对象将进入老年代
37.动态对象年龄判定
38.空间分配担保
YoungGenerationSpace(采用复制算法)
主要用来存储新创建的对象,内存较小,垃圾回收频繁。
这个区又分为三个区域:
一个EdenSpace和两个SurvivorSpace。
•当对象在堆创建时,将进入年轻代的EdenSpace。
•垃圾回收器进行垃圾回收时,扫描EdenSpace和ASuvivorSpace,如果对象仍然存活,则复制到BSuvivorSpace,如果BSuvivorSpace已经满,则复制OldGen
•扫描ASuvivorSpace时,如果对象已经经过了几次的扫描仍然存活,JVM认为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 虚拟机 试题