jvm面试题

1.jvm的监控工具?

        答:1)jvisualvm图形化工具;2)JConsole:JMX的可视化管理工具

164.Java虚拟机的内存布局?

        答:主要分为:本地方法栈(线程私有),虚拟机栈(线程私有),程序计数器(线程私有),方法区,堆。 1)本地方法栈:是虚拟机为用到的本地方法服务,要是请求的栈深度比较大,会抛出StackOverFlowError和OutOfMemoryError。 2)虚拟机栈:是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口信息。它的生命周期和线程相同。 3)程序计数器:是当前线程执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条要执行的字节码服务, 分支,循环,跳转,异常处理,线程不回复等基础功能都需要依赖这个计数器来完成。 4)堆:是所有线程共享的一块内存,主要存放对象实例,堆还分为新生代和老生代;再细分的话有Eden空间,From Survivor空间, To Survivor空间等。该区域也是垃圾回收主要区域。 5)方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码等数据。

289、说说Java虚拟机的生命周期及体系结构?

        答:生命周期:当启动一个Java程序时,一个虚拟机实例就诞生了, 当程序关闭退出时,这个虚拟机实例随之消亡。JVM实例通过main()方法来运行一个Java程序。 而这个main()方法必须是共有的(public)、静态的(static)、返回void,并且接收一个字符串数组为参数。 Java程序初始类中的main()方法,将作为改程序初始线程的起点,任何其他线程都是由这个初试线程启动的。 JVM内部有两种线程:守护线程与非守护线程。守护线程通常是由虚拟机自己使用的,比如垃圾回收线程。 当该程序所有的非守护线程都终止时,JVM实例将自动退出。 体系结构:1)类装载器子系统:在JVM中负责查找并装载类型, JVM中有两种类装载器:启动类装载器和用户自定义类装载器; 2)方法区:类中的类(静态)变量同样存储在方法区中。所有线程共享方法区, 因此,它们对方法区的数据访问必须被设计为线程安全的。方法区的大小不必是固定的; 3)堆:同一个Java程序的多个线程共享同一个堆空间,所有线程都将共享这个堆,Java程序独占一个JVM实例; 4)程序计数器:当执行本地方法时,PC寄存器的内容是下一条将被执行指令的地址;当执行本地方法时,PC寄存器中的值是“undefined”; 5)Java栈:每当启动一个新的线程时,JVM都会为它分配一个Java栈,Java栈上的所有数据都是此线程所独有的; 6)本地方法栈:本地方法本质上是依赖于实现的,JVM实现的设计者们可以自己决定使用怎样的方式来让Java程序调用本地方法; 7)执行引擎:在Java虚拟机规范中,执行引擎的行为使用指令集来定义。

35、Java虚拟机中,数据类型可以分为哪几类?

        答:总共有两类:第一类是:原始类型:数值类型(int、short、long、double、char、byte) 和Boolean类型(true、false)与returnAddress类型(是指向某个操作码的指针, 此操作码与Java虚拟机的指令相对应); 第二类是:引用类型:1)类类型(class type):指向动态创建的类实例; 2)数组类型(array type):指向数值实例;3)接口类型(interface type):指向实现了某个接口的类实例或数组实例; 4)在引用类型中还存在一个特殊的值:null,当一个引用不指向任何对象时,它的值就是null,一个为null的引用可以转 换为任意的引用类型,null也就是引用类型的默认值。

125.JVM里的有几种类加载器(classloader),为什么会有多种?

        答:1)启动类加载器,扩展类加载器,应用类加载器,用户自定义类加载器   2)启动类加载器负责加载JRE核心类库,如:JRE下的 rt.jar , charset.jar ,比如String类 ;  3) 扩展类加载器负责加载JRE下的ext目录下的jar包;   4)应用类加载器负责加载classpath下的jar包;

166.类加载机制,也就是双亲委派模型?

        答:类加载机制: 1)加载:通过类的全限定名找到这个类所在的位置,把它转化为虚拟机内存中的对象。 2)验证:检查java文件对应class文件是否符合虚拟机要求。 3)准备:为类变量(static修饰)分配内存,并设置初始值(例如int为0)。 4)解析:就是将常量值的引用替换为实际值的过程。 5)初始化:初始化会把类中所有用了static修饰的变量以及静态语句块执行一遍。 双亲委派模型:不管是应用程序类加载器还是自定义类加载器在进行类加载时它首先不会自己去加载, 它会把加载任务委派给自己的父类加载器,比如有个类需要自定义类加载器来加载,它会把它交给应用程序类加载器, 应用程序类加载器又会把任务交给扩展类加载器,一直往上提交,直到启动类加载器。启动类加载器如果在自己的扫描范围内能找到类, 它就会去加载,如果它找不到,它就会交给它的下一级子加载器去加载,以此类推。

144.深入分析了Classloader,双亲委派机制?

        答:ClassLoader分为根加载器(Bootstrap ClassLoader)和其它加载器。 其中根加载器负责加载Java的核心类,由JVM实现,而其它类加载器都由Java层实 现并继承java.lang.ClassLoader。1)启动类加载器负责将%JAVA_HOME%/lib目 录中或-Xbootclasspath中参数指定的路径中的,并且是虚拟机识别的(按名称)类库加载到JVM中。 2)Extension ClassLoader(扩展类加载器)负责加载%JAVA_HOME%/lib/ext中的所有类库。 3)System ClassLoader(加载%CLASSPATH%路径的类库)以及其它自定义的ClassLoader。 双亲委派模型:不管是应用程序类加载器还是自定义类加载器在进行类加载时它首先不会自己去加载, 它会把加载任务委派给自己的父类加载器,比如有个类需要自定义类加载器来加载,它会把它交给应用程序类加载器, 应用程序类加载器又会把任务交给扩展类加载器,一直往上提交,直到启动类加载器。启动类加载器如果在自己的扫描范围内能找到类, 它就会去加载,如果它找不到,它就会交给它的下一级子加载器去加载,以此类推。

77.什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处?

         答:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类, 而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此, 因此所有的请求都应该最终传送到顶层的启动类加载器中, 只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围没有找到所需的类时), 子加载器才会自己主动去加载。使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了 一种带有优先级的层次关系。

78,什么情况下我们需要破坏双亲委派模型?

        答:1)发生在双亲委派模型出现之前–即JDK1.2发布之前。 由于双亲委派模型是在JDK1.2之后才被引入的, 而类加载器和抽象类java.lang.ClassLoader则是J

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值