java虚拟机的gc机制的优缺点_深入Java虚拟机之 -- 总结面试篇
系列文章:
在学习 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虚拟机之 -- 总结面试篇相关推荐
- JAVA之JVM GC 机制与性能优化
1 背景介绍 与C/C++相比,JAVA并不要求我们去人为编写代码进行内存回收和垃圾清理.JAVA提供了垃圾回收器(garbage collector)来自动检测对象的作用域),可自动把不再被使用的存 ...
- java 避免gc_Java GC机制
Java GC机制是JVM中一个最重要的部分,了解GC机制也对了解JVM中内存分布,日志查看等原理有所了解 存储划分 垃圾回收算法 1.引用计数(Reference Counting) 2.标记清除( ...
- java传统的项目有哪些内容_请问java全套内容都有什么呢?
我整理的Java全套内容学习路线,分为6个阶段(大阶段)第一阶段:java内功心法篇 第二阶段:Java武功秘籍(经典框架) 第三阶段:Java高级功法(主流框架) 第四阶段:Java成神之路 第五阶 ...
- java写一段程序代表心情_讨论java初步学习的方法及心情
Java的重要性 Java语言的三大特点,面向对象.良好的跨平台性和健壮性,这三大特点使Java被广大编程人员接收并且使用.Java的核心机制有Java虚拟机和垃圾回收机制这两种,Java虚拟机通过解 ...
- java程序设计案例教程 钱银中_《Java程序设计案例教程》【价格 目录 书评 正版】_中国图书网...
出版说明 前言 第1章 概述 1.1 Java语言的发展历史 1.2 Java语言的特点 1.3 Java虚拟机 1.4 Java的应用 1.5 Java开发环境的建立 1.6 编辑.编译和运行Jav ...
- java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...
- 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 ...
- java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 谈论Java技术似乎无处不在,但究竟是什么呢? 下面的部分将解释Java技术如何既是一种编程语言,又是一种平台,并概述这种技术可以为您做些什么. Java ...
- java怎么把毫秒转换成天数_关于java:如何将毫秒转换为“ hh:mm:ss”格式?
我糊涂了. 绊倒这个线程后,我试图找出如何格式化具有hh:mm:ss格式的倒数计时器. 这是我的尝试- //hh:mm:ss String.format("%02d:%02d:%02d&qu ...
- java 中的finally你知多少_「JAVA」详述Java异常体系,处理异常时配上finally效果更佳...
什么是异常 从事Java开发的小伙伴对于"异常"应该不陌生,因为每天都会遇到不少异常,或捕获,或抛出.那究竟什么是异常?异常即非正常的,不同于平常.一般化的情况.在平时生活中,医生 ...
最新文章
- hibernate正向生成数据库表以及配置——Student.java
- 在SQL Navigator 中做 oracle pl/sql SQL分析
- 视频专辑:轻松学习flash动画制作视频教程
- Sublime Text提示Unable to download XXX. Please view the console for more details安装插件失败解决(转)
- pcm 采样率转换_All Video Converter Pro for mac(音视频格式转换器)
- 计算机教师教学心得体会,信息技术教师教学的一点体会
- 第 1 章 MySQL 的架构介绍
- 用 RSocket 解决响应式服务之间的通讯
- jdbc mysql 存储过程执行失败_JDBC连接执行MySQL存储过程报权限错误
- 推荐三个图片无损放大的软件给你
- eaxsinbx_二次微分方程的通解
- 正确划分音节——英语见字发音的秘诀
- EverEdit安装
- 小虎电商浏览器:拼多多怎么看单品实时数据
- SysY文法编译器前端设计实现
- NLP-D38-nlp比赛D7-pytorch踩坑继续刷题
- python输出换行
- TeamViewer疑似被入侵事件分析
- 用户账户计算机管理员密码,电脑管理员密码是什么
- 最全的国外机器学习资源(上)
热门文章
- 按照ISO26262标准检验建模规范:基于模型的软件开发质量工具
- Atitit 信息系统安全法 目录 1. 常见的安全保护目标	1 2. WEB安全风险行为	2 2.1. Injection	2 2.2. Broker Authentication损坏的身份验证
- Atitit node.js自定义模块化 Function walkFileTree() exports.walkFileTree =walkFileTree 引用 Files=require
- Atitit 定时器在项目的应用于 servless数据库 atikvdb 目录 1.1. 项目背景	1 1.2. 特点::免驱动。简单快捷。。	1 1.3. 功能指标	1 1.4. 模块与功能实
- paip.脚本操作IIS启动停止站点
- paip.提升安全性-----使用HTTPS SSL
- ClickHouse:A股分钟数据的查询速度的测试[下]
- 全球顶级金融机构Citadel:堡垒如何建成|精品投行系列二
- 一段程序看懂比特币原理
- 洛神云网络 SLB 负载均衡新姿势