JVM重点整理

一、虚拟机架构图

在这里插入图片描述

二、类加载过程

在这里插入图片描述
类加载器的作用:负责把class文件加载到内存中

类加载过程:

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

三、类加器的分类

在这里插入图片描述

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

双亲委派机制:
在这里插入图片描述
在这里插入图片描述
好处: 避免类的重复加载、保护程序安全,防止核心API被篡改。
沙箱安全机制: 保护原生JDK的安全。

四、内部结构

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

2、本地方法:(native修饰的)与java环境外交互、与操作系统交互。本地方法栈:用来管理本地方法的结构 线程私有
3、虚拟机栈:
概念:栈是运行时的单位、栈解决程序运行时的问题,即程序如何执行,或者如何处理数据。
栈帧:一个内存区块,栈中数据以栈帧格式存在,每个方法对应一个栈帧。
在这里插入图片描述
局部变量表:存储方法参数和定义在方法体内的局部变量,数组结构,建立在线程的栈上,线程私有不存在数据安全问题。容量大小在编译期就已确定,随栈帧的销毁而销毁。
运行原理:先进后出
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、逃逸分析目前还不是很成熟
六、方法区(元空间)
线程共享的区域,此区域大小决定了系统可以加载多少个类
堆栈方法区三者的关系:
在这里插入图片描述
内部结构:

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

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

七、垃圾回收

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

八、垃圾回收算法

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

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

3、标记清除算法
在这里插入图片描述

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

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

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

九、MinorGC/MajorGC/FullGC的对比

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

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

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

相关文章

智能电表远程抄表系统原理

智能电表远程抄表系统是现代智能电网建设的重要组成部分,它利用物联网技术实现电表数据的远程采集、传输和处理,提高了电力公司的抄表效率,同时也为用户提供了更加便捷、准确的用电服务。本文将从远程智能电表抄表系统的工作原理、特点、应用…

每天一道C语言编程:排队买票

题目描述 有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置互…

精益生产有哪些管理工具?

精益生产有哪些管理工具? 一、什么是精益生产 智能制造是落实我国制造强国战略的重要举措,加快推进智能制造,是加速我国工业化和信息化深度融合、推动制造业供给侧结构性改革的重要着力点,对重塑我国制造业竞争新优势具有重要意义…

优化类问题建模解析

模型建立阶段 线性规划模型:目标函数和约束条件均为线性 整数规划或0-1规划:决策变量取值被限制为整数或0、1 动态优化模型:以时间为划分阶段的动态过程优化问题 非线性规划模型:目标函数或约束条件中包括非线性函数 多目标规划模…

超高性能协议框架fury完爆protostuff(附性能测试对比)

简单介绍: 序列化框架是系统通信的基础组件,在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时,都需要进行序列化,其性能和易用性影响运行效率和开发效率。 Fury 是一个基于…

SSH服务(二十六)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、概述 二、特点 三、身份验证机制 四、验证过程 五、加密机制 六、基本参数 ​七、 身份验证机制 八、基本操作 1. ssh 2. scp 3. sftp 4. 密钥对验证 总结 前…

人工智能商业变现途径,并介绍详细公司案列

目录 1. 推荐系统:2. 智能广告和营销:3. 聊天机器人和虚拟助手:4. 自动化和机器人化:5. 数据分析和预测:6. 机器视觉和图像识别:7. 金融科技(FinTech):8. 医疗诊断和健康…

m4a文件出现损坏应该如何修复?

M4A文件,也称为Apple Lossless Encoder,是一种类似于MP4文件的音频格式。它们之间唯一的区别是M4A文件里面没有视频。作为一个音频文件,它已被广泛使用,常用的Windows,Media Player,Mac quicktime和iTunes等…

【MongoDB实战】数据备份与恢复(部分迁移)

场景: 需求: 解决方案: 步骤: Stage 1:【生产环境】修改备份文件映射 Stage 2:【生产环境】重新构建mongodb Stage 3:【客户环境】修改备份文件映射,同 Stage 1 Stage 4&…

九五从零开始的运维之路(其二十)

[TOC](文章目录) 文章目录 前言一、LAMP是什么二、配置环境及安装1.配置yum源2.关闭防火墙、网络图形化工具及SElinux3.安装软件包 三、配置apache服务器内容四、启动服务五、访问验证总结 前言 本篇将简述的内容:Linux系统下的LAMP平台部署 基于discuz框架的论坛搭…

用WooCommerce创建一个多用户商城系统和多供应商市场

线上市场是下一波数字化商务。2020 年,超过60% 的线上支出是通过数字市场发生的。人们喜欢从市场上购物,因为它们使购物变得容易。出于同样的原因,企业喜欢通过它们进行销售。通过多用户商城系统和多供应商WooCommerce商城设置,每…

kafka接收外部接口的数据,并实现转发

目录 一、什么是kafka 二、kafka接收外部接口数据 三、kafka收到数据后转发 四、kafka总结 一、什么是kafka Kafka是一种分布式流式处理平台,最初由LinkedIn开发。它设计用于高吞吐量、低延迟的数据处理,能够处理大规模的实时数据流。Kafka采用发布…

gitee 使用

1.打开git bash 2.cd 进入到合适位置 3.git clone 项目 4.配置用户名和email(不然没法记录谁操作的) pycharm (ctrlk)

个人微信机器人开发

微信机器人的主要职责是为了帮助群主来进行微信社群的管理,微信机器人当前主要分为两种,一种是微信聊天机器人,还有一种是微信群管理机器人。 微信聊天机器人的主要职责是可以在群内聊天,从而提高微信群活跃度;微信群管…

【Ceph集群应用】CephFS文件系统之MDS接口详解

CephFS文件系统之MDS接口详解 1.创建CephFS文件系统MDS接口1.1 创建cephfs1.2 基于内核的客户端挂载1.3 基于fuse工具方式的客户端挂载 接上文基于ceph-deploy部署Ceph集群详解 1.创建CephFS文件系统MDS接口 服务端操作 (1)在admin管理节点创建mds服务…

Java打怪升级路线的相关知识

第一关:JavaSE阶段 1、计算机基础 2、java入门学习 3、java基础语法 4、流程控制和方法 5、数组 6、面向对象编程 7、异常 8、常用类 9、集合框架 10、IO 11、多线程 12、GUI编程 13、网络编程 14、注解与反射 15、JUC编程 16、JVM探究 17、23种设计模式 18、数据结构与算法 1…

PowerDesigner 数据库建模使用详解

目录 一、前言 二、PowerDesigner概述 2.1 PowerDesigner核心能力 2.1.1 集成多种建模能力 2.1.2 自动生产代码能力 2.1.3 强大的逆向工程能力 2.1.4 可扩展的企业库解决方案 2.2 PowerDesigner常用的几种模型 2.2.1 概念模型 2.2.2 逻辑数据模型 2.2.3 物理模型 2.2…

学习AJAX

AJAX 🚀 HTTP请求报文响应报文 🚄 express框架🚬 express基本使用 🚒 原生AJAX🚬 GET.HTML🚬 POST.HTML🚬 JSON.HTML🚬 nodemon工具可以帮助重启服务🚬 IE缓存问题&#…

ELK 企业级日志分析系统(四)

ELK 一、部署Kafka集群二、Kafka的命令行操作三、Kafka架构深入四、FilebeatKafkaELK部署 一、部署Kafka集群 1.下载安装包 官方下载地址:http://kafka.apache.org/downloads.html cd /opt wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.1/kafka_2…

铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…