从0开始回顾JVM---系列四

简介: 虚拟机执行1、类的生命周期吗?一个类从被加载到虚拟机内存中开始,到从内存中卸载,整个生命周期需要经过七个阶段:加载 、验证、准备、解析、初始化 、使用 和 卸载,其中验证、准备、解析三个部分统称为连接。2、什么是类加载?类加载的过程?类加载: 虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象。类加载过程如下:● 加载:1、根据类的全限定类名获取二进制字节流;2、将字节流代表的静态存储结构转为方法区运行时存储数据结构;3、在堆中生成Class对象,作为方法区这个类数据访问入口;● 验证: 检验加载的class文

虚拟机执行

1、类的生命周期吗?


一个类从被加载到虚拟机内存中开始,到从内存中卸载,整个生命周期需要经过七个阶段:加载验证准备解析初始化使用卸载,其中验证、准备、解析三个部分统称为连接。

2、什么是类加载?类加载的过程?


类加载: 虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象。

类加载过程如下:

  • 加载:1、根据类的全限定类名获取二进制字节流;2、将字节流代表的静态存储结构转为方法区运行时存储数据结构;3、在堆中生成Class对象,作为方法区这个类数据访问入口;
  • 验证: 检验加载的class文件正确性(修饰符、权限)
  • 准备: 为类的静态变量分配内存并设置类变量初始值;
  • 解析: 将常量池中符号引用转为直接引用(class文件常量池转至方法区运行时常量池)
  • 初始化: 对类的静态变量和静态代码块执行初始化工作

3、什么是类加载器?常见的类加载器有哪些?


类加载器是指:通过一个类的全限定性类名获取该类的二进制字节流叫做类加载器。

类加载器分为以下四种:

  • 启动类加载器:  用来加载java核心类库,无法被java程序直接引用;(JAVA_HOME/lib 如rt.jar)
  • 扩展类加载器用来加载java的扩展库(JAVA_HOME/jre/lib/ext)
  • 系统类加载器加载用户类路径ClassPath下的类
  • 用户自定义加载器由java语言实现,继承自ClassLoader;

4、什么是双亲委派模型?为什么需要双亲委派模型?


当一个类加载器收到一个类加载的请求,它首先不会尝试自己去加载,而是将这个请求委派给父类加载器去加载,只有父类加载器在自己的搜索范围内查找不到此类时,子加载器才会尝试自己去加载该类。

原因:

  • 这是为了防止我们将来使用核心类中相同的包名和类名创建类,此时如果没有双亲委派机制,加载了我们自写的类,可能会对代码有很大影响,如果使用双亲委派机制加载了核心类库中的该类,就不会再加载相同名称的我们自写的类了,确保类加载的安全

那怎么打破双亲委派模型?

  • 自定义类加载器,继承ClassLoader类,重写loadClass方法和findClass方法。
  • 线程上下文类加载器。
  • Tomcat,应用的类加载器优先自行加载应用目录下的 class,并不是先委派给父加载器,加载不了才委派给父加载器。

5、热部署实现原理?


热部署概述:

  • 对于Java应用程序来说,热部署就是在运行时更新Java类文件。也就是不重启服务器的情况下实现java类文件的替换修改等 。

作用

  • 可以不重启应用的情况下,更新应用。举个例子,就像电脑可以在不重启的情况下,更换U盘。  

原理

  • 简单一句话让JVM重新加载新的class文件!

在类加载器中,Java类只能被加载一次,并且无法卸载。因此我们可以考虑直接把类加载器给换了,自定义类加载器,并重写ClassLoader的findClass方法。想要实现热部署可以分以下三个步骤:

  1. 销毁原来的自定义ClassLoader;
  2. 更新class类文件;
  3. 创建新的ClassLoader去加载更新后的class类文件。    

6、Class文件结构?

7、为什么有垃圾收集还会有内存泄漏问题?


对象定义在错误的范围

  • 如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。

异常处理不当

  • 各种资源的关闭一定要放在finally里面。

8、堆和栈有什么区别?


  1. 申请方式
  • stack: 由系统自动分配。
  • heap: 需要程序员自己申请,并指明大小
  1. 申请效率
  • stack:由系统自动分配,速度较快,但程序员是无法控制的。
  • heap:由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
  1. 大小限制
  • stack:栈顶的地址和栈的最大容量是系统预先规定好的。
  • heap:堆的大小受限于计算机系统中有效的虚拟内存,运行期间确定,因此比较灵活。
  1. 存贮内容
  • stack:存贮局部变量表,操作数栈
  • heap:存贮对象实例与数组
相关文章
|
1天前
|
运维 监控 数据可视化
从0开始回顾JVM---系列五
JVM调优 1、有哪些常用的命令行性能监控和故障处理工具? 操作系统工具 ● top:显示系统整体资源使用情况 ● vmstat:监控内存和CPU ● iostat:监控IO使用 ● netstat:监控网络使用 JDK性能监控工具 ● jps:虚拟机进程查看 ● jstat:虚拟机运行时信息查看 ● jinfo:虚拟机配置查看 ● jmap:内存映像(导出) ● jhat:堆转储快照分析 ● jstack:Java堆栈跟踪 ● jcmd:实现上面除了jstat外所有命令的功能 2、了解哪些可视化的性能监控和故障处理工具? 以下是一些JDK自带的可视化性能监控和故障处理工具: ● JCons
|
1天前
|
存储 算法 安全
从0开始回顾JVM---系列三
20、有哪几种垃圾回收器,各自的优缺点是什么? ⚡ 垃圾回收器主要分为以下几种:Serial,Parallel,CMS,G1。 1. Serial ● 单线程垃圾回收器,该线程运行时,其他线程都暂停,使用复制算法; ● 使用场景: 堆内存较小,适合个人电脑(CPU核数较小); a. 工作在老年区,回收算法:标记整理;工作在新生代,回收算法:复制; b. 单线程的垃圾回收器,只有一个垃圾回收线程在运行; c. 垃圾回收线程结束后,其他线程恢复运行; d. 触发垃圾回收时让所有线程在安全点停下【在垃圾回收过程中,对象的地址可能发生改变,为了保证安全使用对象地址,要
|
1天前
|
Java
jvm---类加载器(1)
jvm---类加载器(1)
|
1天前
|
存储 Java 编译器
从0开始回顾JVM---系列一
引言 1、什么是JVM? JVM——Java虚拟机,它是Java实现平台无关性的基石。 Java程序运行的时候,编译器将Java文件编译成平台无关的Java字节码文件(.class),接下来对应平台JVM对字节码文件进行解释,翻译成对应平台匹配的机器指令并运行。 同时JVM也是一个跨语言的平台,和语言无关,只和class的文件格式关联,任何语言,只要能翻译成符合规范的字节码文件,都能被JVM运行。 内存管理 1、什么是JVM内存结构? Java1.8 之后的内存结果图: JVM将虚拟机分为5大区域,程序计数器、虚拟机栈、本地方法栈、java堆、方法区,其中方法区和堆是线程共享区,虚拟
|
1天前
|
存储 缓存 算法
从0开始回顾JVM---系列二
11、什么情况下会发生内存泄露? 1. 静态集合类引起内存泄漏 ● 静态集合的生命周期和 JVM 一致,所以静态集合引用的对象不能被释放。 2. 单例模式 ● 单例对象在初始化后会以静态变量的方式在 JVM 的整个生命周期中存在。如果单例对象持有外部的引用,那么这个外部对象将不能被 GC 回收,导致内存泄漏。 3. 数据连接、IO、Socket等连接 ● 创建的连接不再使用时,需要调用 close 方法关闭连接,只有连接被关闭后,GC 才会回收对应的对象(Connection,Statement,ResultSet,Session)。忘记关闭这些资源会导致持续占有内存,无法被 GC 回收。 4
|
1天前
|
安全 Java
《深入理解java虚拟机》学习笔记-----郑雨迪
《深入理解java虚拟机》学习笔记-----郑雨迪
45 0
|
9月前
|
算法 Java 数据库
Java基础学习---3、堆、GC(一)
Java基础学习---3、堆、GC(一)
|
9月前
|
算法 Java
Java基础学习---3、堆、GC(二)
Java基础学习---3、堆、GC(二)
|
10月前
|
算法 Java API
Java虚拟机System.gc()解析
对于Java语言来说是不用刻意手动去释放内存,同时,也尽可能不需要手动去干预Java虚拟机的GC行为。在本篇文章中,我们试图从多个方面去解析有关System.gc()API调用的最常见问题。希望对需要了解这块技术的朋友有所帮助。
142 0
|
存储 缓存 监控
JVM详解 --- 垃圾回收机制
JVM详解 --- 垃圾回收机制
JVM详解 --- 垃圾回收机制