码迷,mamicode.com
首页 > 其他好文 > 详细

jvm(n):JVM面试

时间:2019-08-20 01:15:13      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:direct   怎么   数据信息   如何获取   如何   jit   代码   反序列化   运行时数据区   

1、JVM管理的内存结构是怎样的?

查看JVM运行时数据区

2、不同的虚拟机在实现运行时内存的时候有什么区别?

JVM运行时所需的内存区域,不同的虚拟机实现上有所不同,规范对于方法区的管理是最宽松的:

方法区在虚拟机启动的时候创建,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集与压缩。本版本的规范也不限定实现方法区的内存位置和代码编译的管理策略。方法区的容量可以是固定的,也可以随着程序执行的需求动态扩展,并在不需要过多的空间时自行收缩。方法区在实际内存空间站可以是不连续的。

虚拟机规范对方法区实现的位置并没有明确要求,在最著名的HotSopt虚拟机实现中(在Java 8 之前),方法区仅是逻辑上的独立区域,在物理上并没有独立于堆而存在,而是位于永久代中。这时候方法区也是可以被垃圾回收的。

在Java 8中 ,HotSpot虚拟机移除了永久代,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)

3、运行时数据区中哪些区域是线程共享的?哪些是独享的?

在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。

而Java堆、方法区是线程共享的。

Java堆其实还为每一个线程单独分配了一块TLAB空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。(TLAB介绍)

4、除了JVM运行时内存以外,还有什么区域可以用吗?

直接内存。

在JDK 1.4中引入的NIO中,引入了一种基于Channel和Buffer的I/O方式,他可以使用Native函数直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。

5、堆和栈的区别是什么?

一个是线程独享的,一个是线程共享的,二者之间最大的区别就是存储的内容不同:

堆中主要存放对象实例。 栈(局部变量表)中主要存放各种基本数据类型、对象的引用。

6、Java中的数组是存储在堆上还是栈上的?

数组的实例是保存在堆中,而数组的引用是保存在栈上的。

7、Java中的对象创建有多少种方式?

Java中共有5种方式可以创建一个对象。

  1. 使用new关键字:User user = new User();

  2. 使用反射机制创建对象:User user = User.class.newInstance();

  3. 使用Constructor类的newInstance:Constructor<User> constructor = User.class.getConstructor(); User user= constructor.newInstance();

  4. 使用clone方法

  5. 反序列化的方式

8、Java中对象创建的过程是怎么样的?
  1. 虚拟机遇到new指令,到常量池定位到这个类的符号引用。

  2. 检查符号引用代表的类是否被加载、解析、初始化过。

  3. 虚拟机为对象分配内存。

  4. 虚拟机将分配到的内存空间都初始化为零值。

  5. 虚拟机对对象进行必要的设置。

  6. 执行方法,成员变量进行初始化。

9、Java中的对象一定在堆上分配内存吗?

逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

如果JIT经过逃逸分析,发现有些对象没有逃逸出方法,那么有可能堆内存分配会被优化成栈内存分配。

10、如何获取堆和栈的dump文件?

Java Dump,Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。

可以使用在服务器上使用jmap命令来获取堆dump,使用jstack命令来获取线程的调用栈dump。

jvm(n):JVM面试

标签:direct   怎么   数据信息   如何获取   如何   jit   代码   反序列化   运行时数据区   

原文地址:https://www.cnblogs.com/angelica-duhurica/p/11380638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!