JVM架构和GC垃圾回收机制详解

JVM架构图分析

下图:参考网络+书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看: Hadoop内存溢出(OOM)分类、参数调优化)

JVM被分为三个主要的子系统

(1)类加载器子系统(2)运行时数据区(3)执行引擎

1. 类加载器子系统

Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、链接并初始化该类文件。

1.1 加载

类由此组件加载。启动类加载器 (BootStrap class Loader)、扩展类加载器(Extension class Loader)和应用程序类加载器(Application class Loader) 这三种类加载器帮助完成类的加载。

1.  启动类加载器 – 负责从启动类路径中加载类,无非就是rt.jar。这个加载器会被赋予最高优先级。

2.  扩展类加载器 – 负责加载ext 目录(jre\lib)内的类.

3.  应用程序类加载器 – 负责加载应用程序级别类路径,涉及到路径的环境变量等etc.

上述的类加载器会遵循委托层次算法(Delegation Hierarchy Algorithm)加载类文件

1.2 链接

1.  校验 – 字节码校验器会校验生成的字节码是否正确,如果校验失败,我们会得到校验错误

2.  准备 – 分配内存并初始化默认值给所有的静态变量。

3.  解析 – 所有符号内存引用方法区(Method Area)原始引用所替代。

1.3 初始化

这是类加载的最后阶段,这里所有的静态变量会被赋初始值, 并且静态块将被执行。

2. 运行时数据区(Runtime Data Area)

The 运行时数据区域被划分为5个主要组件:

2.1 方法区(Method Area)

所有类级别数据将被存储在这里,包括静态变量。每个JVM只有一个方法区,它是一个共享的资源。

2.2 堆区(Heap Area)

所有的对象和它们相应的实例变量以及数组将被存储在这里。每个JVM同样只有一个堆区。由于方法区堆区的内存由多个线程共享,所以存储的数据不是线程安全的

2.3 栈区(Stack Area)

对每个线程会单独创建一个运行时栈。对每个函数呼叫会在栈内存生成一个栈帧(Stack Frame)。所有的局部变量将在栈内存中创建。栈区是线程安全的,因为它不是一个共享资源。栈帧被分为三个子实体:

a 局部变量数组 – 包含多少个与方法相关的局部变量并且相应的值将被存储在这里。

b 操作数栈 – 如果需要执行任何中间操作,操作数栈作为运行时工作区去执行指令。

c 帧数据 – 方法的所有符号都保存在这里。在任意异常的情况下,catch块的信息将会被保存在帧数据里面。

2.4 PC寄存器

每个线程都有一个单独的PC寄存器来保存当前执行指令的地址,一旦该指令被执行,pc寄存器会被更新至下条指令的地址。

2.5 本地方法栈

本地方法栈保存本地方法信息。对每一个线程,将创建一个单独的本地方法栈。

3. 执行引擎

分配给运行时数据区的字节码将由执行引擎执行。执行引擎读取字节码并逐段执行。

3.1  解释器:

解释器能快速的解释字节码,但执行却很慢。 解释器的缺点就是,当一个方法被调用多次,每次都需要重新解释。

编译器

JIT编译器消除了解释器的缺点。执行引擎利用解释器转换字节码,但如果是重复的代码则使用JIT编译器将全部字节码编译成本机代码。本机代码将直接用于重复的方法调用,这提高了系统的性能。

a. 中间代码生成器 – 生成中间代码

b. 代码优化器 – 负责优化上面生成的中间代码

c. 目标代码生成器 – 负责生成机器代码或本机代码

d.  探测器(Profiler) – 一个特殊的组件,负责寻找被多次调用的方法。

3.3  垃圾回收器:

收集并删除未引用的对象。可以通过调用"System.gc()"来触发垃圾回收,但并不保证会确实进行垃圾回收。JVM的垃圾回收只收集哪些由new关键字创建的对象。所以,如果不是用new创建的对象,你可以使用finalize函数来执行清理。

Java本地接口 (JNI)JNI 会与本地方法库进行交互并提供执行引擎所需的本地库。

本地方法库:它是一个执行引擎所需的本地库的集合。

JVM三大核心区域

通过一个小程序认识JVM

 package com.spark.jvm;
/*** 从JVM调用的角度分析java程序堆内存空间的使用:* 当JVM进程启动的时候,会从类加载路径中找到包含main方法的入口类HelloJVM* 找到HelloJVM会直接读取该文件中的二进制数据,并且把该类的信息放到运行时的Method内存区域中。* 然后会定位到HelloJVM中的main方法的字节码中,并开始执行Main方法中的指令* 此时会创建Student实例对象,并且使用student来引用该对象(或者说给该对象命名),其内幕如下:* 第一步:JVM会直接到Method区域中去查找Student类的信息,此时发现没有Student类,就通过类加载器加载该Student类文件;* 第二步:在JVM的Method区域中加载并找到了Student类之后会在Heap区域中为Student实例对象分配内存,* 并且在Student的实例对象中持有指向方法区域中的Student类的引用(内存地址);* 第三步:JVM实例化完成后会在当前线程中为Stack中的reference建立实际的应用关系,此时会赋值给student* 接下来就是调用方法* 在JVM中方法的调用一定是属于线程的行为,也就是说方法调用本身会发生在线程的方法调用栈:* 线程的方法调用栈(Method Stack Frames),每一个方法的调用就是方法调用栈中的一个Frame,* 该Frame包含了方法的参数,局部变量,临时数据等 student.sayHello();*/
public class HelloJVM {//在JVM运行的时候会通过反射的方式到Method区域找到入口方法mainpublic static void main(String[] args) {//main方法也是放在Method方法区域中的/*** student(小写的)是放在主线程中的Stack区域中的* Student对象实例是放在所有线程共享的Heap区域中的*/Student student = new Student("spark");/*** 首先会通过student指针(或句柄)(指针就直接指向堆中的对象,句柄表明有一个中间的,student指向句柄,句柄指向对象)* 找Student对象,当找到该对象后会通过对象内部指向方法区域中的指针来调用具体的方法去执行任务*/student.sayHello();}
}class Student {// name本身作为成员是放在stack区域的但是name指向的String对象是放在Heap中private String name;public Student(String name) {this.name = name;}//sayHello这个方法是放在方法区中的public void sayHello() {System.out.println("Hello, this is " + this.name);}
}
  1. MapReduce过程详解及其性能优化

转发:https://blog.csdn.net/aijiudu/article/details/72991993

JVM架构和GC垃圾回收机制--面试相关推荐

  1. JVM架构和GC垃圾回收机制详解

    JVM架构图分析 下图:参考网络+书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看: Hadoop内存溢出(OOM)分类.参数调优化) JVM被分为三个主要的子系统 (1)类加载器子系统(2)运 ...

  2. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  3. 详解JVM内存管理与垃圾回收机制5 - Java中的4种引用类型

    在Java语言中,除了基础数据类型的变量以外,其他的都是引用类型,指向各种不同的对象.在前文我们也已经知道,Java中的引用可以是认为对指针的封装,这个指针中存储的值代表的是另外一块内存的起始地址(对 ...

  4. java gc 有钱人_小猿圈java之GC垃圾回收机制

    垃圾回收机制是提高性能的重要机制,所以不管学什么语言也好,垃圾回收机制都是有的,也是很重要的,小猿圈这章详解一下java的GC垃圾回收机制,需要用的或者感兴趣的朋友们,可以跟着小编学习一下. 一.GC ...

  5. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  6. java如何关闭gc,GC垃圾回收机制,

    GC垃圾回收机制, 个人理解: 因为在使用JAVA创建一个类或者对象后,难免会存在以后不使用的情况,为了减少其继续再占用内存,必须建立一套清理垃圾的机制,但是怎么判断什么样的才算是不使用的垃圾呢,这里 ...

  7. java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  8. jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

    jvm gc(垃圾回收机制) Java JVM  垃圾回收(GC 在什么时候,对什么东西,做了什么事情) 前言:(先大概了解一下整个过程) 作者:知乎用户 链接:https://www.zhihu.c ...

  9. Day125.JVM:栈、堆、GC 垃圾回收机制

    目录 一.JVM 体系结构概述 ★★★ 栈 (stack) 堆 (Heap) 新生区.养老区.永久代(元空间) 堆参数调优 OOM 问题定位解决 二.GC 垃圾回收 1.垃圾判定 2.垃圾回收算法 ★ ...

最新文章

  1. 【POJ】2503 Babelfish(字典树,map,指针)
  2. 就在明天!对话晶泰科技赖力鹏:AI制药独角兽的崛起之路
  3. linux下163YUM源配置
  4. JQuery元素选择器:和||,逻辑选择
  5. docker 容器 defunct 僵尸进程
  6. js 获取 屏幕 可用高度...
  7. Silverlight中调用WebService-发送邮件测试实例
  8. 专科java程序设计试卷_java程序设计试卷(含答案)
  9. 手持终端可以根据行业的功能要求进行定制
  10. micropython仿真器_Micropython教程之TPYBoard DIY超声波测距仪实例演示
  11. cnsul linux环境后台启动_Linux环境下批量启动、停止或重启jar服务的shell脚本
  12. 数学建模_混合赌博模型
  13. 设计模式学习笔记(九:中介者模式)
  14. 如何将java/Android签名工具keytool单独提取出来使用
  15. 游戏挂机时计算机设置在哪里,蜂窝助手怎么挂机 游戏蜂窝电脑版挂机设置教程...
  16. 银行硬件维护维修工单小程序开发制作
  17. 数据分析真题日刷 | 网易2018校园招聘数据分析工程师笔试卷
  18. 硕士学位答辩PPT制作技巧
  19. Python:strip() 函数
  20. json对象的遍历(C++)

热门文章

  1. 第十六期:简单的介绍一下大数据中最重要的MapReduce
  2. STMF4x 固件库V1.25.0
  3. Vue 中使用watch监听$route 无效问题
  4. 手机端双击页面放大的问题
  5. git报错:‘fatal:remote origin already exists‘怎么处理?附上git常用操作以及说明。
  6. vue监听滚动开始与结束
  7. 条件变量 ---C++17 多线程
  8. PyTorch 系列 | 数据加载和预处理教程
  9. r语言 将表格导出为csv_如何将R语言中表格数据输出为Excel文件.pdf
  10. 元组、字典、集合的常用方法