JVM重点整理

这篇具有很好参考价值的文章主要介绍了JVM重点整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、虚拟机架构图

JVM重点整理,JVM,jvm

二、类加载过程

JVM重点整理,JVM,jvm
类加载器的作用:负责把class文件加载到内存中

类加载过程:

  • 加载:
    • 通过类的全限定名获取此类的二进制字节流
    • 文件的编码结构---->运行时的内存结构
    • 内存中生成一个class对象
  • 链接:
    • 验证:保证被加载类的一个正确性
    • 准备:为类变量分配内存 设置类变量初始值(不会为final修饰的变量以及实例变量赋值)
    • 解析:相当于一个翻译过程
  • 初始化: 初始化阶段执行类加载方法() 的过程,()不同于类的构造器。若该类具有父类,JVM 会保证子类的()执行前,父类的该方法已经执行完。多线程下被同步加锁。

三、类加器的分类

JVM重点整理,JVM,jvm

  • 虚拟机自带的类加载器:
    • 启动类加载器:由c/c++语言实现,嵌套在JVM内部,不继承自java.lang.ClassLoader,没有父加载器,只加载java、javax、sun等开头的类
    • 扩展类加载器:派生于ClassLoader类,父类加载器为启动类加载器。
    • 应用类加载器:默认的类加载器,一般来说,java应用的类都是由它完成加载。派生于ClassLoader类,父类加载器为扩展类加载器。通过ClassLoader.getSystemClassLoader()方法获取该类加载器。
    • 自定义类加载器:
      • 好处:隔离加载类
      • 修改类加载的方式
      • 扩展加载源
      • 防止源码泄露

双亲委派机制:
JVM重点整理,JVM,jvm
JVM重点整理,JVM,jvm
好处: 避免类的重复加载、保护程序安全,防止核心API被篡改。
沙箱安全机制: 保护原生JDK的安全。

四、内部结构

1、PC 寄存器: 用来存储下一条即将执行的指令地址,指令由执行引擎执行。
使用PC寄存器存储字节码指令地址有什么用?/ 或为什么使用PC寄存器记录当前线程的执行地址?
因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

2、本地方法:(native修饰的)与java环境外交互、与操作系统交互。本地方法栈:用来管理本地方法的结构 线程私有
3、虚拟机栈:
概念:栈是运行时的单位、栈解决程序运行时的问题,即程序如何执行,或者如何处理数据。
栈帧:一个内存区块,栈中数据以栈帧格式存在,每个方法对应一个栈帧。
JVM重点整理,JVM,jvm
局部变量表:存储方法参数和定义在方法体内的局部变量,数组结构,建立在线程的栈上,线程私有不存在数据安全问题。容量大小在编译期就已确定,随栈帧的销毁而销毁。
运行原理:先进后出
4、堆空间
概述:

  • 一个JVM实例对应一个进程实例,一个JVM实例有一个运行时数据区。
  • 一个Runtime就有一个独立的方法区和堆
  • 一个进程有多个线程,多个线程共享一个方法区和堆空间
  • 一个线程拥有自己独立的程序计数器、本地方法栈、虚拟机栈
  • 为了解决多个线程访问出现线程不安全问题—>TLAB(线程私有空间)
  • 垃圾回收只会在堆(方法区)当中进行回收

堆内存细分:
基本划分:新生代+老年代+元空间
比例:新生代:老年代=1:2
新生代=Eden:from:to=8:1:1
创建对象在Eden区

内存分配策略

  • 默认对象分配在Eden区
  • 如果一个对象回收超过阈值次数还存活就把它放入老年代
  • 大对象分配在老年代
  • 对于体积不大的对象优先分配在Eden区的TLAB区
  • 对象还有可能分配在栈空间

TLAB区(Thread Local Allocation Buffer)

为什么要有该区域?
	堆空间是线程共享的区域,在高并发的场景下分配内存空间,会出现线程不安全的问题,采用加锁虽然可以避免此问题但是会影响效率。
	TLAB是线程私有的一块区域,即使多个线程同时分配也不会有线程安全的问题,提高吞吐量,快速分配,JVM会将TLAB作为内存分配的首选

五、逃逸分析
1、为什么存在逃逸分析
如果对象在堆内存分配–可能引起GC–导致STW–应用程序卡顿,而逃逸分析可以减少此类现象的发生
2、什么情况在栈上分配
如果一个对象没有发生逃逸,就可以在栈上分配,随着方法的结束对象的出栈,不涉及GC有效提高性能
3、判断对象是否发生逃逸
new出来的对象是否被外部方法调用,调用了就代表逃逸了。新建对象尽量是局部变量
4、逃逸分析目前还不是很成熟
六、方法区(元空间)
线程共享的区域,此区域大小决定了系统可以加载多少个类
堆栈方法区三者的关系:
JVM重点整理,JVM,jvm
内部结构:

  • 类的信息:类、接口、枚举等
  • 域信息:包的public、protected、private等
  • 方法信息:方法名称、返回类型
  • 常量信息
  • 静态变量/类变量

方法区的垃圾回收:
必要又难以让人满意,主要回收常量池里面不常使用常量和类型

七、垃圾回收

垃圾:在程序运行过程中没有任何指针指向该对象
意义: 不进行垃圾回收内存迟早会消耗完,导致其他对象无法分配内存,没有GC则无法保证应用程序的正常进行。
回收区域: 只有方法区和堆、频繁收集新生代、较少收集老年代、基本不动元空间/方法区

八、垃圾回收算法

判断对象是否存活的两种算法:引用计数法和可达性分析算法
1、引用计数算法
对于一个对象被引用则加1,引用失效就减1,当计数器为0时则表示该对象为垃圾。
缺点:无法解决循环依赖的问题
JVM重点整理,JVM,jvm
2、可达性分析算法:
以根对象为起始点从上往下搜索根对象所链接的对象是否可达,搜索走过的路径被称为引用链,不可达对象称为垃圾,
判定一个对象是否可回收,至少要经历两次标记过程。
JVM重点整理,JVM,jvm
GC Roots包含元素

  • 方法区中常量引用对象
  • 同步sync关键字持有的对象
  • 静态类变量

3、标记清除算法
JVM重点整理,JVM,jvm

标记: 从引用根节点开始遍历,标记所有被引用的对象。一般是对象的header中记录为可达对象
清除: 从头到尾进行遍历,如果某个对象在其header中没有标记为可达对象,则将其回收,清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表,下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够就存放。
缺点: 产生空间碎片,还需要维护一个空闲列表
4、标记压缩算法(老年代)

JVM重点整理,JVM,jvm
缺点:移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址,移动过程中,需要全程暂停用户应用程序即STW。
5、复制算法(新生代)
核心思想:将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。

在Eden区空间用完并且程序需要再创建对象时触发Minor GC 在GC后,如果对象仍然存活,将会被移到Survior区。
JVM重点整理,JVM,jvm
再次触发GC的时候Eden区和from区两者会作为回收区域
在Eden和from回收存活的对象复制到to之后要做三件事情
1、清空Eden和from区
2、把原先from变为to原先to变为from
3、对象d年龄加1(年龄达到设定值—>老年代)
JVM重点整理,JVM,jvm
优点:没有标记和清除过程,高效、不会产生空间碎片
缺点:需要两倍活着对象的空间大小
6、分代回收算法
新生代和老年代回收算法
7、增量回收算法
垃圾收集线程每次只收集一部分空间,接着切换到应用程序,反复执行,可避免长时间STW
缺点:线程来回切换造成上下文开销,降低吞吐量
8、分区回收算法
把一个内存区域划分为多个内存空间,每次只回收若干小区域内存
9、总结
没有最好的回收算法,只有最合适的,目前用的最多的是复合算法

九、MinorGC/MajorGC/FullGC的对比

a.MinorGC
只回收新生代
新生代空间不足的时候,该区域有个特点 对象大部分是朝生夕死
会触发STW 暂停其他用户线程 垃圾收集结束 用户线程才恢复
b.MajorGC
回收老年代
回收速度比MinorGC慢10倍以上 STW时间更长
c.FullGC
回收整个堆与方法区
更应该尽量避免文章来源地址https://www.toymoban.com/news/detail-588664.html

到了这里,关于JVM重点整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

    最基础的算法,分为两个阶段,“标记”和“清除” 原理: - 标记阶段:collector从mutator根对象开始进行遍历,对从mutator根对象可以访问到的对象都打上一个标识,一般是在对象的header中,将其记录为可达对象。 - 清除阶段,collector对堆内存(heap memory)从头到尾进行线性的遍历

    2024年02月16日
    浏览(32)
  • 第一次后端复习整理(JVM、Redis、反射)

    文章仅为自身笔记 详情查看一篇文章掌握整个JVM,JVM超详细解析!!! jvm是Java虚拟机 程序员编写代码形成.java文件 经过javac编译成.class文件 再通过JVM的类加载器进入运行时数据区 就是我们java运行时的东西的存放区域 其中分为五个模块 线程共享的: 方法区 堆 线程私有的

    2024年02月15日
    浏览(26)
  • 【JVM】JVM执行流程 && JVM类加载 && 垃圾回收机制等

    目录 🌷1、JVM是什么? 🌷2、JVM的执行流程(能够描述数据区5部分) 🌷3、JVM类加载过程 🌷4、双亲委派机制:描述类加载的过程 问题1:类加载器 问题2:什么是双亲委派模型?  问题3:双亲委派模型的优点 🌷5、垃圾回收机制(重要,针对的是堆)    问题1:判定对象

    2024年02月15日
    浏览(48)
  • 【JVM】JVM概述

    基本介绍 JVM:全称 Java Virtual Machine,即 Java 虚拟机,一种规范,本身是一个虚拟计算机,直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作 特点: Java 虚拟机基于 二进制字节码 执行,由一套字节码指令集、一组寄存器、一个栈

    2024年01月18日
    浏览(37)
  • 【JVM】JVM常用指令

    性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、

    2024年02月08日
    浏览(28)
  • JVM——JVM参数指南

    在本篇文章中,你将掌握最常用的 JVM 参数配置。如果对于下面提到了一些概念比如堆、 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里

    2024年02月12日
    浏览(29)
  • 【JVM】初识 Jvm

    目录 什么是JVM JVM 的功能 常见的JVM JVM 的全程是  Java Virtual Machine   ( java 虚拟机 ) JVM 是一种用于计算设备的规范,也是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能实现,JVM 屏蔽了与具体操作系统平台相关的信息,使 java 程序只需生成在 java虚

    2024年02月02日
    浏览(40)
  • JVM——JVM 垃圾回收

    本节常见面试题 问题答案在文中都有提到 如何判断对象是否死亡(两种方法)。 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算

    2024年02月12日
    浏览(29)
  • JVM 17 调优指南:如何进行JVM调优,JVM调优参数

    在这篇文章中,我会详细介绍JVM调优的概念、重要性和具体的JVM调优参数。此外,我将提供12个实用的代码示例,每个示例都会包含JVM调优参数和相应的Java代码。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 JVM调优是调整

    2024年02月02日
    浏览(35)
  • JVM 8 调优指南:如何进行JVM调优,JVM调优参数

    这篇文章将详细介绍如何进行JVM 8调优,包括JVM 8调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 JVM调优是指通过调整Java虚拟

    2024年01月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包