zoukankan      html  css  js  c++  java
  • Java 虚拟机部分面试题

    Java虚拟机部分的面试内容包括三部分:GC、类加载机制以及内存

    Java内存区域

    1. JVM内存分为哪几部分,这些部分分别都存储哪些数据?
      线程隔离的数据区:程序计数器、Java虚拟机栈、本地方法栈。
      由所有线程共享的数据区:Java堆、方法区。
      程序计数器
      可以看作当前线程所执行的字节码的行号指示器。
      Java虚拟机栈
      Java虚拟栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。
      本地方法栈
      本地方法栈与Java虚拟机栈所发挥的作用是非常相似的。它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到Native方法服务。
      Java堆
      存放对象实例
      方法区
      存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    2. 对象的创建过程
      例如:

    Dog dog= new Dog();

    当虚拟机执行到new指令时,它先在常量池中查找“Dog”,看能否定位到Dog类的符号引用;如果能,说明这个类已经被加载到方法区了,则继续执行。如果没有,就让Class Loader先执行类的加载。

    然后,虚拟机开始为该对象分配内存,对象所需要的内存大小在类加载完成后就已经确定了。这时候只要在堆中按需求分配空间即可。具体分配内存时有两种方式,第一种,内存绝对规整,那么只要在被占用内存和空闲内存间放置指针即可,每次分配空间时只要把指针向空闲内存空间移动相应距离即可,当某对象被GC回收后,则需要进行某些对象内存的迁移。第二种,空闲内存和非空闲内存夹杂在一起,那么就需要用一个列表来记录堆内存的使用情况,然后按需分配内存。

    对于多线程的情况,如何确保一个线程分配了对象内存但尚未修改内存管理指针时,其他线程又分配该块内存而覆盖的情况?有一种方法,就是让每一个线程在堆中先预分配一小块内存(TLAB本地线程分配缓冲),每个线程只在自己的内存中分配内存。但对象本身按其访问属性是可以线程共享访问的。

    内存分配到后,虚拟机将分配的内存空间都初始化为零值(不包括对象头)。实例变量按变量类型初始化相应的默认值(数值型为0,boolan为false),所以实例变量不赋初值也能使用。接着设置对象头信息,比如对象的哈希值,GC分代年龄等。

    从虚拟机角度,此时一个新的对象已经创建完成了。但从我们程序运行的角度,新建对象才刚刚开始,对象的构造方法还没有执行。只有执行完构造方法,按构造方法进行初始化后,对象才是彻底创建完成了。

    构造函数的执行还涉及到调用父类构造器,如果没有显式声明调用父类构造器,则自动添加默认构造器。

    到此,new运算符可以返回堆中这个对象的引用了。

    此刻,会根据dog这个变量是实例变量、局部变量或静态变量的不同将引用放在不同的地方:

    如果dog局部变量,dog变量在栈帧的局部变量表,这个对象的引用就放在栈帧。
    如果dog是实例变量,dog变量在堆中,对象的引用就放在堆。
    如果dog是静态变量,dog变量在方法区,对象的引用就放在方法区。

    GC

    1. 在Java中如何判断对象已死?

      (1)应用计数法
      (2)可达性分析法

    2. 在Java中对象什么时候可以被回收?

      当一个对象到GC Roots不可达时,在下一个垃圾回收周期中尝试回收该对象,如果该对象重写了finalize()方法,并在这个方法中成功自救(将自身赋予某个引用),那么这个对象不会被回收。但如果这个对象没有重写finalize()方法或者已经执行过这个方法,也自救失败,该对象将会被回收。

    3.垃圾收集算法

    (1)标记-清除法(2)复制算法(3)标记-整理法(4)分代收集算法

    类加载机制

    类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中,类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。

  • 相关阅读:
    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
    asp.net cookie and session
    leelazero and google colab
    download file by python in google colab
    physical processor, core, logical processor
    通过powershell操作eventlog
    openxml in sql server
    get the page name from url
    How to Execute Page_Load() in Page's Base Class?
    Difference between HttpContext.Request and Request
  • 原文地址:https://www.cnblogs.com/haxianhe/p/9271017.html
Copyright © 2011-2022 走看看