java常见面试题:jvm面试题

java常见面试题:jvm面试题,第1张

目录

1、请你谈谈你对JVM的理解?

        1.方法区

        2.堆

        3.虚拟机栈

        4.本地方法栈

        5.程序计数器

2、jvm的类加载机制?

一、jvm类加载机制的5个阶段:

二、类加载器

3、JDK 中常用的设计模式有哪些?

1、单例模式

2、静态工厂模式

3、抽象エ厂

4、原型模式

5、适配器模式

6、装饰器模式

7、外观模式

9、代理模式

10、迭代器模式

11、命令模式


1、请你谈谈你对JVM的理解?

        JVM由JVM运行时数据区(图示中蓝色框包含部分)、执行引擎、本地库接口、本地方法库组成。

        JVM运行时数据区,分为方法区、堆、虚拟机栈、本地方法栈和程序计数器。

        1.方法区

         Java 虚拟机规范中定义方法区是堆的一个逻辑部分。方法区存放以下信息:已经被虚拟机加载的类信息,常量,静态变量,即时编译编译器编译后的代码。线程共享的区域。为了与堆区分,方法还有一个别名:Non-Heap(非堆)。

        2.堆

        堆是用来存放对象的内存空间,几乎所有的对象都存储在堆中。这一区域是线程共享,整个 Java 虚拟机只有一个堆,所有的线程都访问同一个堆。堆又可划分为新生代、老年代和元空间。

        3.虚拟机栈

        Java 虚拟机栈是描述 Java 方法运行过程的内存模型。Java 虚拟机栈会为每一个即将运行的 Java 方法创建一块叫做“栈帧”的区域,用于存放该方法运行过程中的一些信息,比如:局部变量表, *** 作数栈,动态链接,方法出口信息等,方法执行的过程即为栈帧压栈出栈的过程。

        4.本地方法栈

        本地方法栈是为 JVM 运行 Native 方法准备的空间,由于很多 Native 方法都是用 C 语言实现的,所以它通常又叫 C 栈。它与 Java 虚拟机栈实现的功能类似,只不过本地方法栈是描述本地方法运行过程的内存模型。

        5.程序计数器

       程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined

        这几部分都有相关的JDK自带工具可以分析查看,比如jps, jstack, jmap, jhat, jstat等,还有图形化工具jconsole,jvisualvm,但对于Linux服务器就无能为力了。


2、jvm的类加载机制? 一、jvm类加载机制的5个阶段:

      加载-连接(验证-准备-解析)-初始化-使用-卸载。

二、类加载器


1、jvm提供了三种类加载器:

    BootStrap ClassLoader:负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被虚拟机认可(按文件名识别,如 rt.jar)的类
    Extension ClassLoader:负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类库。
    Application ClassLoader:负责加载用户路径(classpath)上的类库。
    JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承 java.lang.ClassLoader实现自定义的类加载器。

2、双亲委派

当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

采用双亲委派的一个好处是不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。


3、JDK 中常用的设计模式有哪些? 1、单例模式

作用:保证类只有一个实例。

JDK中体现:Runtime类。

2、静态工厂模式

作用:代替构造函数创建对象,方法名比构造函数清晰。

JDK中体现:Integer.valueOf、Class.forName

3、抽象エ厂

作用:创建某一种类的对象。

JDK中体现:Java.sql包。

4、原型模式

clone();

原型模式的本质是拷贝原型来创建新的对象,拷贝是比ew更快的创建对象的方法,当需要大批量创建新对象而且都是同一个类的对象的时候考虑使用原型模式。

一般的克隆只是浅拷贝(对象的hash值不一样,但是对象里面的成员变量的hash值是一样的)。

有些场景需要深拷贝,这时我们就要重写clone方法,以ArrayList为例:

5、适配器模式

作用:使不兼容的接口相容。

JDK中体现:InputStream、OutputStream.

6、装饰器模式

作用:为类添加新的功能,防止类继承带来的类爆炸。

JDK中体现:io类、Collections、List。

7、外观模式

作用:封装一组交互类,一直对外提供接口。

JDK中体现:logging包。8、享元模式

作用:共享对象、节省内存。

JDK中体现:Integer.valueOf、String常量池。

9、代理模式

作用:

(1)透明调用被代理对象,无须知道复杂实现细节:

(2)增加被代理类的功能;

JDK中体现:动态代理。

10、迭代器模式

作用:将集合的迭代和集合本身分离。

JDK中体现:terator

11、命令模式

作用:封装 *** 作,使接口一致。

JDK中体现:Runable、Callable、ThreadPoolExecutor。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/724578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存