java上机面试题 039_深入 Java 虚拟机之面试总结篇

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

一、JVM常见面试题介绍下 Java 内存区域

Java 对象的创建过程

对象的访问定位有几种

String、StringBuilder、StringBuffer 有什么不同?

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

1.1 介绍下 Java 内存区域

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

e952e0c74fc4c156c87803a8a39a9461.png

可以看到Java 的内存区域就是框框里的东西:

5f563857eaba4d8de413319d39fc8289.png

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

1.2 Java 对象的创建过程

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

3d9968af6da2410c58a13d5680a62208.png

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

3f1a279aad9ceed863c3d64e912a880f.png

1.3 对象的访问定位有几种

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

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

e413e58812df10d75871f140e888eb21.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 强引用、软引用、弱引用、虚引用

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

c617916e020183c9610594baaa80387f.png

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

6988b29ee6c0cfa0006254b2569977aa.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 执行一次,如下图:

54dfd27eb2dc88cdfd036fdd7fdb5493.png

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

2.3 方法区会回收资源吗?

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

de6a32d2b083cad43f1b20a68b187075.png

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

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

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

fa29a6c081dcda6fd10c733206154aec.png

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

ff9de0b47be1d9c2fe344344525e3056.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 类加载的过程

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

4b120481e0009c9375c366ce18d32deb.png

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

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

d08cfae0f9c478005743bf374facec0b.png

3.2 Child.value和Child.c_valuepublic 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 什么是双亲委派模型

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

d0cf901af8d887f947b59a0a8ae6c0bb.png

类加载双亲委派模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

1、Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口。JDK 安全 API 是 Java 编程语言的核心 API,位于 java.security 包(及其子包),以及sun.securityAPI包(及其子包&#xff0…

状态设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

python基础——错误处理

python基础——错误处理 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数ope…

java获取数组的最小值_Java 数组获取最大和最小值的实例实现

以下实例演示了如何通过 Collections 类的 Collections.max() 和 Collections.min() 方法来查找数组中的最大和最小值:Main.java 文件:import java.util.Arrays;import java.util.Collections;public class Main {public static void main(String[] args…

Spring_事务(2)

转载于:https://www.cnblogs.com/yang-hao/p/5830952.html

heroku_本月风味– Neo4j和Heroku

herokuNeo4j今年早些时候发起了一项挑战,即“ 种子播云 ”,以使人们使用Neo4j附加组件在Heroku上创建模板或演示应用程序。 经过许多内部辩论之后,我决定进入,但由于缺乏想法而陷入绝望。 当我没有做任何特别的事情时,…

代理设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

春云边车

我有一个部署到基于NetflixOSS的云的应用程序,该应用程序具有以下结构: 本质上是一种将信息持久保存到Cassandra群集的服务。 所有应用程序都已注册到Eureka –因此,在本例中,该服务以及Cassandra节点都已在Eureka中注册&#xf…

activemq端口好_ActiveMQ已准备好黄金时段

activemq端口好ActiveMQ项目始于2005年-在很大程度上,它一直是Apache Software Foundation的顶级项目。 ActiveMQ项目的目的一直是提供世界一流的企业消息传递解决方案,使经纪人能够提供从支持IP的智能设备一直到企业后端的高可用性的连通性。 ActiveMQ提…

js创建节点,小试牛刀

实现如下的功能 非常简单的一个小训练。 思想&#xff1a; 1.首先创建text和一个button 代码如下、 1 <body> 2 <input type"text" id"text1"/> 3 <input id"btn1" type"button" value"创建" /> 4 <u…

企业讯息

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

Spring MVC 学习笔记一 HelloWorld

Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行&#xff08;使用Eclipse&#xff09;&#xff1a; 加入JAR包在web.xml中配置DispatcherServlet加入Spring MVC的配置文件编写处理请求的处理器&#xff0c;并添加对应注解编写视图下面按照国际惯例先来…

php 避免xss_PHP防止XSS注入

我们在做网站的时候&#xff0c;经常有input提交&#xff0c;通常前端对input中的内容不做判断&#xff0c;只做不为空等简单的操作。但是&#xff0c;有的input中会提交一些javascript或者html,会给网站造成一定的危害。为此&#xff0c;防止XSS注入的任务交给了后端&#xff…

全字符微信名 php,PHP方法处理微信昵称特殊符号过滤

我们在通过PHP获取微信昵称&#xff0c;并且存于数据库的时候&#xff0c;由于一些昵称带有特殊符号&#xff0c;所以存不进去&#xff0c;这时候我们可以通过下面的方式来处理。方法二protected function removeEmoji($clean_text) {// Match Emoticons$regexEmoticons /[\x{…

[转载]我的PMP复习备考经验谈(下篇)——一本关于PMP备考的小指南

原文地址&#xff1a;我的PMP复习备考经验谈(下篇)——一本关于PMP备考的小指南作者&#xff1a;羽少宸PMP复习备考经验谈&#xff08;下篇&#xff09;——PMP备考小指南 总结经验&#xff0c;展望未来&#xff0c;以此纪念PMP复习备考时光 继上篇&#xff0c;猛击直达四、如何…

php项目私有化部署保护代码,ThinkPHP项目安全配置解决方案

前言:ThinkPHP MVC框架越来被开发者接受,众多的开发者选择了这个框架&#xff0c;也有很多的优秀项目使用的ThinkPHP框架。最近整理了一下ThinkPHP项目的一些安全配置。可能并不适用全部项目&#xff0c;大家可以适当的使用如下的安全配置。前置知识:web容器和各类组件的版本&a…

大数据分析 es hive_使用Hive和iReport进行大数据分析

大数据分析 es hive每个JJ Abrams的电视连续剧疑犯追踪从主要人物芬奇先生一个下列叙述情节开始&#xff1a;“ 你是被监视。 政府拥有一个秘密系统-每天每天每小时都会对您进行监视的机器。 我知道是因为...我建造了它。 “当然&#xff0c;我们的技术人员知道得更多。 庞大的…

java+jsp+网页制作,java+jsp+mysql网页制作总结(2)

错误&#xff1a;url通过get传递时汉字出错解决&#xff1a;url通过get传递时汉字会乱码&#xff0c;1.String name1request.getParameter("name");String name new String(name1.getBytes("ISO-8859-1"),"gbk");2.通过post传递参数错误&#x…

Redis聚类

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

域策略禁用usb

文档及模板可在 http://pan.baidu.com/s/1qYTcjTy 下载 pro_usb_users.adm 此模板可禁用到 指定盘符&#xff0c;针对用户策略 pro_usb_computers.adm 此模板 针对计算机&#xff0c;一般只要它就好了。 可以从 3 个方面下手 adm 配置 文件。注册表usb驱动其实 adm配置文件&…