系列文章:

在学习 JVM 相关知识,怎么让自己有动力看下去,且有思考性呢?笔者认为,开头用一些常用的面试题,来引入读者的兴趣比较好,这样才会有看下去的东西,所以,该篇文章会以面试+总结的方式,希望读者能先思考写出答案,再查看相关知识。

一、JVM常见面试题

介绍下 Java 内存区域

Java 对象的创建过程

对象的访问定位有几种

String、StringBuilder、StringBuffer 有什么不同?

这是一些常见的面试,很多人都看到网上的标准答案,但你知道为什么吗?

1.1 介绍下 Java 内存区域

首先看第一个,Java的内存区域,可以看一张编译图:

1.png

可以看到Java 的内存区域就是框框里的东西,每一步的大概意思如下,具体细节参考深入Java虚拟机之 --- JVM的爱恨情仇:

2.png

总结,建议读者学习之后,能自己默写这些方法并指导每一步的意思;

1.2 Java 对象的创建过程

Java 对象的创建共分为5步,如下图:

3.png

然后明白每个步骤做了哪些即可,如下:

4.png

1.3、对象的访问定位有几种

有两种方式:句柄和直接指针;

创建对象是为了使用对象,虚拟机需要通过栈中的 reference 来获取堆上的对象。

5.png

优缺点: 使用句柄好处是,当对象发生改变,只需要移动句柄的实例数据指针即可,而直接指针就是速度快。

1.4 String、StringBuilder、StringBuffer 有什么不同

参考答案是:

String 是用 final 修饰的类,由于它的不可变性,类似拼接、裁剪字符串等,都会产生新的对象。

StringBuffer 解决上面拼接对象而提供一个类,可以通过 append等方法拼接,是线程安全的,由于线程安全,效率也下降

StringBuilder 跟StringBuffer 差不多,只是去掉了线程安全,所以优先使用 StringBuilder

说说String 为什么会产生新的对象?比如 String a = "1" String b = a + "2",当执行这条指令时,会在常量池中产生一个对象指向a,而创建b时也会重新在常量池中生成b的对象;多次创建容易触发 GC,这也是为什么不建议使用 String 类去拼接的问题。

二、Java 回收机制常见面试题

简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)

谈谈final、finally、finalize 有什么不同

方法区会回收资源吗?

垃圾回收有哪些算法,各自的特点?

2.1 简单的介绍一下强引用、软引用、弱引用、虚引用

首先,在讲解这几个引用之前,先明白虚拟机为什么会由这些引用的说明;我们都知道,对象需要回收,那怎么去判断哪些对象需要回收呢?这就需要一些判断来确定哪些对象是需要回收的,一般有以下几种方法:

6.png

无论是 引用计算算法还是可达性分析算法,都是涉及到对象的引用问题,所以,在 JDK1.2 之后,又分为以下几类引用:

7.png

通过上面的介绍,知道了"引用"是什么关系,这对理解各种引用还是很有必要的,那么使用 软引用的好处也在那里了;

建议一些内存消耗较大的使用软引用,比如 webview。。

2.2 谈谈final、finally、finalize 有什么不同

final 和finally 比较好理解。首先 final 用来修饰的对象不可变;finally 则是保证重点代码一定要被执行的一种机制,一般用于 try - catch-finally 语句中。

但finalize 是什么东西呢?在解释标准代码之前,又得回到GC算法中了。

首先,finalize 是 Object 的一个方法,用来特定资源的回收。

上面说到,当 GC Roots 不可达时,认为对象已经不再使用了,但是对象并非是非"死"不可,当 GC Roots 不可达时,系统首先会先判断 对象的 finalize 是否执行,不执行则直接回收;如果可以执行,则放在队列中,由finalize线程去执行它,如果有其他对象关联时,则判断对象不可回收,否则对象回收,finalize 执行一次,如下图:

8.png

由于它的不确定性,在 JDK9时,已经标注为deprecated,但不影响我们对它的理解。

2.3 方法区会回收资源吗?

虽说 Java 堆 可以回收70%~95%的空间,但方法区同样可以回收一些资源,方法区主要回收两个部分废弃常量和无用的类。

9.png

所以,当发生 GC 时,非常常量和无用类是可以被回收,当然这里也是说"可以",是否像对象一样被回收,还需要对虚拟机的参数配置,这里就不细说了。

2.4 垃圾回收有哪些算法,各自的特点?

对象的回收,基于上面讲到的,GC Roots不可达,且判断可以回收。衍生的算法如下图(建议能默认每种算法的理解):

10.png

其中,基础是 标记-清除是基础,接下来都是在它的基础上改进,分代算法是主流 Java 虚拟机的主要算法;

其中各个算法特点如下,详细介绍看 JAVA 垃圾回收机制(一) --- 对象回收与算法初识 第四节,垃圾回收篇。

11.png

三、类加载的问题

类加载过程

写出下列代码打印信息,若将改成System.out.println(Child.c_value);改为System.out.println(Child.value); 如何?

public class Parent{

static {

System.out.println("Parent");

}

public static int value = 123;

}

public class Child extends Parent{

static {

System.out.println("Child");

}

public static int c_value = 123;

}

//mian 中执行

public static void main(String[] args) {

System.out.println(Child.c_value);

}

说说你对类加载器的理解

什么是双亲委派模型

3.1 类加载的过程

类加载的过程如下图所示(建议能默认每个步骤的理解):

12.png

也可以成为 加载-连接-初始化 这种叫法。

其中,加载、验证、准备、初始化和卸载的顺序是固定的,而解析则不一定,因为Java是动态语言,它可以在运行时解析,即初始化之后。该阶段解析如下:

13.png

3.2 写出下列代码打印信息,若将改成System.out.println(Child.c_value);改为System.out.println(Child.value); 如何?

public class Parent{

static {

System.out.println("Parent");

}

public static int value = 123;

}

public class Child extends Parent{

static {

System.out.println("Child");

}

public static int c_value = 123;

}

//mian 中执行

public static void main(String[] args) {

System.out.println(Child.c_value);

}

打印信息如:

Parent

123

改为System.out.println(Child.value)时:

Parent

Child

123

class Parent{

public static int value = 1;

static {

value = 2;

}

}

class Child extends Parent{

public static int B = value ;

}

public static void main(String[] args) {

System.out.println(Child.B);

}

输出什么?

3.3 说说你对类加载器的理解

从上面我们知道,类在加载的时候,就是通过一个全限定名去加载这个类的二进制字节流,这个是系统自动完成的。这个动作如果从外部去做,以便于我们去获取所需的类,则我们成为类加载器。比如通过一个路径获取到一个 class 字节码,然后通过反射,拿到相应的信息。

3.4 什么是双亲委派模型

它的工程流程是: 当一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是委派给她的父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载器都会传递到父加载器中;只有父加载器无法完成时,子加载器才会尝试自己去加载,它的模型如下:

14.png

java虚拟机的gc机制的优缺点_深入Java虚拟机之 -- 总结面试篇相关推荐

  1. JAVA之JVM GC 机制与性能优化

    1 背景介绍 与C/C++相比,JAVA并不要求我们去人为编写代码进行内存回收和垃圾清理.JAVA提供了垃圾回收器(garbage collector)来自动检测对象的作用域),可自动把不再被使用的存 ...

  2. java 避免gc_Java GC机制

    Java GC机制是JVM中一个最重要的部分,了解GC机制也对了解JVM中内存分布,日志查看等原理有所了解 存储划分 垃圾回收算法 1.引用计数(Reference Counting) 2.标记清除( ...

  3. java传统的项目有哪些内容_请问java全套内容都有什么呢?

    我整理的Java全套内容学习路线,分为6个阶段(大阶段)第一阶段:java内功心法篇 第二阶段:Java武功秘籍(经典框架) 第三阶段:Java高级功法(主流框架) 第四阶段:Java成神之路 第五阶 ...

  4. java写一段程序代表心情_讨论java初步学习的方法及心情

    Java的重要性 Java语言的三大特点,面向对象.良好的跨平台性和健壮性,这三大特点使Java被广大编程人员接收并且使用.Java的核心机制有Java虚拟机和垃圾回收机制这两种,Java虚拟机通过解 ...

  5. java程序设计案例教程 钱银中_《Java程序设计案例教程》【价格 目录 书评 正版】_中国图书网...

    出版说明 前言 第1章 概述 1.1 Java语言的发展历史 1.2 Java语言的特点 1.3 Java虚拟机 1.4 Java的应用 1.5 Java开发环境的建立 1.6 编辑.编译和运行Jav ...

  6. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  7. java web 应用技术与案例教程_《Java Web应用开发技术与案例教程》怎么样_目录_pdf在线阅读 - 课课家教育...

    出版说明 前言 第1章 java Web应用开发技术概述 1.1 Java Web应用开发技术简介 1.1.1 Java Web应用 1.1.2 Java Web应用开发技术 1.2 Java Web ...

  8. java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 谈论Java技术似乎无处不在,但究竟是什么呢? 下面的部分将解释Java技术如何既是一种编程语言,又是一种平台,并概述这种技术可以为您做些什么. Java ...

  9. java怎么把毫秒转换成天数_关于java:如何将毫秒转换为“ hh:mm:ss”格式?

    我糊涂了. 绊倒这个线程后,我试图找出如何格式化具有hh:mm:ss格式的倒数计时器. 这是我的尝试- //hh:mm:ss String.format("%02d:%02d:%02d&qu ...

  10. java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...

    什么是异常 从事Java开发的小伙伴对于"异常"应该不陌生,因为每天都会遇到不少异常,或捕获,或抛出.那究竟什么是异常?异常即非正常的,不同于平常.一般化的情况.在平时生活中,医生 ...

最新文章

  1. hibernate正向生成数据库表以及配置——Student.java
  2. 在SQL Navigator 中做 oracle pl/sql SQL分析
  3. 视频专辑:轻松学习flash动画制作视频教程
  4. Sublime Text提示Unable to download XXX. Please view the console for more details安装插件失败解决(转)
  5. pcm 采样率转换_All Video Converter Pro for mac(音视频格式转换器)
  6. 计算机教师教学心得体会,信息技术教师教学的一点体会
  7. 第 1 章 MySQL 的架构介绍
  8. 用 RSocket 解决响应式服务之间的通讯
  9. jdbc mysql 存储过程执行失败_JDBC连接执行MySQL存储过程报权限错误
  10. 推荐三个图片无损放大的软件给你
  11. eaxsinbx_二次微分方程的通解
  12. 正确划分音节——英语见字发音的秘诀
  13. EverEdit安装
  14. 小虎电商浏览器:拼多多怎么看单品实时数据
  15. SysY文法编译器前端设计实现
  16. NLP-D38-nlp比赛D7-pytorch踩坑继续刷题
  17. python输出换行
  18. TeamViewer疑似被入侵事件分析
  19. 用户账户计算机管理员密码,电脑管理员密码是什么
  20. 最全的国外机器学习资源(上)

热门文章

  1. 按照ISO26262标准检验建模规范:基于模型的软件开发质量工具
  2. Atitit 信息系统安全法 目录 1. 常见的安全保护目标 1 2. WEB安全风险行为 2 2.1. Injection 2 2.2. Broker Authentication损坏的身份验证
  3. Atitit node.js自定义模块化 Function walkFileTree() exports.walkFileTree =walkFileTree 引用  Files=require
  4. Atitit 定时器在项目的应用于 servless数据库 atikvdb 目录 1.1. 项目背景 1 1.2. 特点::免驱动。简单快捷。。 1 1.3. 功能指标 1 1.4. 模块与功能实
  5. paip.脚本操作IIS启动停止站点
  6. paip.提升安全性-----使用HTTPS SSL
  7. ClickHouse:A股分钟数据的查询速度的测试[下]
  8. 全球顶级金融机构Citadel:堡垒如何建成|精品投行系列二
  9. 一段程序看懂比特币原理
  10. 洛神云网络 SLB 负载均衡新姿势