博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 虚拟机部分面试题
阅读量:5045 次
发布时间:2019-06-12

本文共 1718 字,大约阅读时间需要 5 分钟。

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.cnblogs.com/haxianhe/p/9271017.html

你可能感兴趣的文章
简单动画原理
查看>>
Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
查看>>
VS2008安装失败!Microsoft Visual Studio Web 创作组件
查看>>
[kuangbin带你飞]专题七 线段树
查看>>
Ajax创建对象的方法
查看>>
提供多种类型IP数据业务的通信系统d 第三代移动通信系统
查看>>
476. 数字的补数python
查看>>
Spring Cloud(三) --- hystrix
查看>>
在办公室坐着总爱胡思乱想 太无聊 反而很累。想辞职
查看>>
代码自测检查单模板
查看>>
常用数据与VARIANT之间的转换---从网上整理
查看>>
javascript面试题(二)
查看>>
使用MATLAB对图像处理的几种方法(下)
查看>>
MVC
查看>>
nginx服务启动脚本
查看>>
LOL喷子专用自动骂人工具,2018更新完整版!
查看>>
unity3d中设计模式的学习<一>:泛型单例
查看>>
pexpect模块获取root密码
查看>>
转自牛客网-JVM的相关知识整理和学习
查看>>
css布局方式
查看>>