【java面试经(架构师&设计师)-第3课】java虚拟机和内存优化

技术清单

申明:本文属于整理加工原创,部分举证材料来自于网络,仅用于学习参考。

本文主要介绍java数据结构相关知识,通过本文讲解,你可以明白:

1、JDK、JRE、JVM的概念和区别是什么?

2、Java程序编译和运行的过程,JVM如何加载字节码文件的,类加载器如何卸载字节码?

3、JVM内存模型是怎样的?Java运行时数据区情况?一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,几个对象,几个属性,几个方法?

4、堆和栈的区别是什么?在java内存分配中,什么时候会存到堆,什么时候会存到栈?为什么要这样设计?

5、JVM GC,GC算法常用的有哪些?实现原理是什么?什么情况会出现Full GC,什么情况会出现yong GC?System.gc()?

技术解析

一、JDK、JRE、JVM的概念和区别是什么?

1、JDK:Java Development Kit(Java开发工具包),jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等;JDK有以下三种版本:

1)J2SE,standard edition,标准版,是我们通常用的一个版本;

2)J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序;

3)J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序。

2、JRE:Java Runtime Enviromental(java运行时环境),也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。

3、JVM:Java Virtual Mechinal(JAVA虚拟机),JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file)。类文件的组成包括 JVM 指令集,符号表以及一些补助信息。

二、Java程序编译和运行的过程,JVM如何加载字节码文件的,类加载器如何卸载字节码?

类从被加载到虚拟机内存到卸载出内存的生命周期包括:加载->连接(验证->准备->解析)->初始化->使用->卸载

1、加载:加载是类加载的第一个阶段,虚拟机要完成以下三个过程:

1)通过类的全限定名获取定义此类的二进制字节流;

2)将字节流的存储结构转化为方法区的运行时结构;

3)在内存中生成一个代表该类的Class对象,作为方法区各种数据的访问入口

2、验证:目的是确保class文件字节流信息符合虚拟机的要求;

3、准备:为static修饰的变量赋初值,例如int型默认为0,boolean默认为false;

4、解析:虚拟机将常量池内的符号引用替换成直接引用;

5、初始化:初始化是类加载的最后一个阶段,将执行类构造器< init>()方法,注意这里的方法不是构造方法。该方法将会显式调用父类构造器,接下来按照java语句顺序为类变量和静态语句块赋值;

6、使用(方法调用):Java是一门面向对象的语言,它具有多态性。那么虚拟机又是如何知道运行时该调用哪一个方法?

静态分派是在编译期就决定了该调用哪一个方法而不是由虚拟机来确定,方法重载就是典型的静态分派。动态分派是在虚拟机运行阶段才能决定调用哪一个方法,方法重写就是典型的动态分派。

动态分派的实现:当调用一个对象的方法时,会将该对象的引用压栈到操作数栈,然后字节码指令invokevirtual会去寻找该引用实际类型。如果在实际类型中找对应的方法,且访问权限足够,则直接返回该方法引用,否则会依照继承关系对父类进行查找。实际上,如果子类没有重写父类方法,则子类方法的引用会直接指向父类方法。

由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。

Java虚拟机自带的类加载器包括根类加载器扩展类加载器系统类加载器

Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的

由用户自定义的类加载器加载的类是可以被卸载的

7、卸载:

JVM中的Class只有满足以下三个条件,才能被GC回收,也就是该Class被卸载(unload):

1)该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值