金三银四,如今快到跳槽高峰期了,很多小伙伴在面试的时候,恐怕都会遇到jvm虚拟机的一些刁钻问题吧,我总结了如下几个高频问题。
1、类的加载流程
【.Class Files】 -> 【加载 (ClassLoader)】 -> 【链接 (验证、准备、解析)】 -> 【初始化】
2、类的加载器
启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器
3、双亲委派机制
在类的加载时,不会由当前加载器直接加载,而是先由委托父加载器,父加载器在委托父亲加载器的父加载器,直到最上层的父加载器时候,然后再尝试去加载,如果加载失败了,再发通知由子加载器加载。 好处举例:自定义的java.lang.String不会替代jdk的String
4、Java虚拟机运行时数据区
1、程序计数器: 特点:内存空间较小,线程私有化。 字节码解释器的工作原理就是通过改变计数器的值来寻找下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、以及线程恢复等基础功能都需要依赖计数器完成 2、Java虚拟机栈 特点:线程的私有描述的是java方法运行时的内存模型 每一个方法在运行时都会创建一个栈帧,其中存储着(局部变量表、操作数栈、动态链接、方法出口),局部变量表中包含了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向的是一条字节码指令的地址) 3、本地方法栈 为虚拟机使用的native方法服务 异常: StackOverflowError(栈溢出):线程请求的栈深度大于虚拟机所允许的深度。 OutOfMemoryError(内存溢出):如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。 4、Java堆新生代(伊甸园Eden区、from区、to区),老年代 5、方法区 特点:线程共享 存储虚拟机加载的类信息、常量、静态变量以及编译后的代码
5、直接内存
非Java虚拟机运行时数据区中的内存部分,操作系统直接管理 举例:java NIO中的DriectByteBuffer,可以避免在 Java 堆和 Native 堆中来回的数据耗时操作。 异常:OutOfMemoryError:会受到本机内存限制,如果内存区域总和大于物理内存限制从而导致动态扩展时出现该异常。
6、运行时常量池
属于方法区一部分,用于存放编译期生成的各种字面量和符号引用。编译器和运行期(String 的 intern() )都可以将常量放入池中。内存有限,无法申请时抛出 OutOfMemoryError。
好了,分享就到这里,希望各位程序员能够斩获offer,拿到高薪!请关注“知了堂学习社区”,地址:http://zhiliaotang.cn