4.JVM八股
JVM空间划分
线程共享和线程私有
1.7:
线程共享:
堆、方法区
线程私有:
虚拟机栈、本地方法栈、程序计数器
本地内存
1.8:
线程共享:
堆
线程私有:
老三样
本地内存,元空间
程序计数器
虚拟机栈
由一个个栈帧组成
每一个栈帧中包含了:
- 局部变量表
- 方法返回地址
每调用一次函数,就会有对应的一个栈帧入栈。
本地方法栈
同虚拟机栈,只不过存的是native方法
native本地方法,就是指非java语言实现的,而是更底层的用C实现的
堆
用来存放对象的
新生代、老年代、永久代(元空间)
字符串常量池
方法区
是一个抽象的概念
具体实现由:永久代、元空间实现
用来存放类信息的地方、以及运行时常量池
直接内存
独立于JVM之外的,只受操作系统影响的内存
垃圾回收原理
- 先执行young GC(一般使用 标记复制法)
- 然后执行full GC(标记清除、或者标记整理)
对象创建过程
- 类加载检查
- 分配内存
- CAS失败重试
- TLAB空间预留
- 初始化0值
- 设置对象头
- 初始化init
对象的内存布局
- 对象头
- 类指针
- GC年龄
- Mark word锁信息
- 实例数据
- 对其填充
对象的访问定位
两种:
句柄
直接指针
GC原理
垃圾回收的基本原理
- 优先在新生代分配,回收Minor GC
- 当老年代满了的时候,会触发full gc
- 什么情况下新生代对象加入老年代:年龄够了,大文件直接进入
对象死亡的判断方法
引用计数法,一般不用,有循环依赖问题
可达性分析法:
初次标记GC ROOT,
并发标记之后的,
最后STW重新。
GC root有哪些?
虚拟机站、本地方法栈、方法区的常量引用的对象
常量的GC规则
常量本质上是一种弱引用,
当不再有虚拟机栈的变量引用它时,下一次GC就会回收。
类信息的回收原则
也是一种弱引用,它的引用前提比较多
- 没有实例了
- 没有类加载器了
- 没有相关类的引用了
垃圾收集算法
年轻代的复制标记算法为什么是8 :1 :1?
分代的3种垃圾收集
1、Serial + SerialOld
单线程,STW
2、Parallel Scavenge + Parallel Old
多线程并行,STW
默认1.8
3、ParNew + CMS
1、CMS的特点:第一个并发的垃圾收集器
2、原理:可达性分析+ 三色标记
3、过程:3此标记,1次并发整理
4、解决漏标:使用增量更新
5、缺点:浮动垃圾+标记清除碎片太多
分区收集器
4、G1
1、第一个分区收集器,1.9开始默认、分区,可以设置最大停顿时间,
2、原理:3个回收过程
young GC、Mix GC、full GC
3、过程:3次标记+1次筛选清理(用优先队列维护需要先被清理的内容)(STW)
4、解决漏标:STAB(需要额外的RSET,记录当前的Reign被哪些别的Reign给引用过)
5、采用标记整理、标记复制
5、ZGC收集器
颜色指针+读屏障
类文件结构
类文件以.class存在在方法区(元空间)
总体构成:略
类加载过程
1、加载
- 类加载器读取字节码
- 生成class类,作为访问方法区中类文件结构的入口
2、连接
2-1、验证
主要是验证字节码,保证字节码符合JVM规范
2-2、准备
分配内存,初始化零值
2-3、解析
把符号引用转为直接引用
符号引用是指类、方法、等符号指向内存地址,是间接的。
直接引用是指,使用内存地址偏移量指向具体的内容,保证了快速访问。
3、初始化
就是执行构造方法
当实例化时才执行
注意:
按需加载、按需连接。
类加载器
介绍
1、读取解析字节码中的内容,
2、生成class对象存入方法区。
注意:
是按需加载
且加载有持久性
内置的3种类加载器
1、BootStrap ClassLoader
long包下的、Object的。。。
2、Extension ClassLoader
JDBC等
3、App ClassLoader
用户自定义的类
如何自定义类加载器
1、定义类加载器,继承ClassLoader、重写findClass或者loadClass方法,更具全类名找到字节码,然后创建class对象到方法区。
2、使用时
- new 类加载器
- 使用loadClass加载
- 使用得到的class对象,newInstance、getMethod、invoke创建实例、使用实例方法。
findClass和loadClass的区别?
- loadClass:先去父类中使用loadClass加载,如果没法加载,才会使用自己的loadClass的加载逻辑。
- findClass:不去父类中加载,直接在本层加载
loadClass遵循双亲委派机制,findClass不遵循
双亲委派机制
当一个类加载器要加载一个字节码时,首先不是自己加载,而是使用上层的类加载器加载,如果上层无法加载才使用本层加载。
- 自底向上询问
- 自顶向下加载
双亲委派模型的好处
- 保证类不会被重复加载(假设不同的类加载器加载同一个类,那么最后都会变成同一个类加载器加载类)
- 保证核心API不被篡改(核心的类,比如long下的类,最终都只会被bootstrapClassloader加载)
JVM调优
监控内存情况
1、优先可视化:
使用Jconsole
2、其次使用命令行:
Jstat、Jinfo
JVM调优参数设置
1、
分配堆内存
分配栈内存
分配元空间内存
分配新生代、老年代内存
2、
调整对象年龄阈值(什么时候适合缩短?)
默认多大对象直接进入老年区
3、设置垃圾收集器
4、G1的最大停顿时间
-Xms
-Xmx
-Xss
-XX:MetaSpace
-XX:newSize
-XX:MaxTenuringThreshold
调优思路
就是尽可能把该进入老年代的提前进入老年代,不该进入老年代的在新生代就GC掉
相关文章:
4.JVM八股
JVM空间划分 线程共享和线程私有 1.7: 线程共享: 堆、方法区 线程私有: 虚拟机栈、本地方法栈、程序计数器 本地内存 1.8: 线程共享: 堆 线程私有: 老三样 本地内存,元空间 程序计数器 …...
内网渗透系列-mimikatz的使用以及后门植入
内网渗透系列-mimikatz的使用以及后门植入 文章目录 内网渗透系列-mimikatz的使用以及后门植入前言mimikatz的使用后门植入 msf永久后门植入 (1)Meterpreter后门:Metsvc(2)Meterpreter后门:Persistence NC后…...
5G网络开通与调测ipv4
要求如下: 1. 勘站规划 1. 【重】首先观察NR频点,完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下:观察AAU的通道数,最大发射功率;选择N41的选型频段也要选41 2. …...
Spark开窗函数之ROW
Spark 1.5.x版本以后,在Spark SQL和DataFrame中引入了开窗函数,其中比较常用的开窗函数就是row_number 该函数的作用是根据表中字段进行分组,然后根据表中的字段排序;其实就是根据其排序顺序,给组中的每条记录添 加一个序号;且每组的序号都是从1开始,可利用它的这个特性进行分组…...
双向链表的实现(详解)
目录 前言初始化双向链表的结构为双向链表的节点开辟空间头插尾插打印链表尾删头删查找指定位置之后的插入删除pos节点销毁双向链表 前言 链表的分类: 带头 不带头 单向 双向 循环 不循环 一共有 (2 * 2 * 2) 种链表 带头指的是:带有哨兵位节点 哨兵位&a…...
SpringBoot项目中如何使用校验工具
用到hutool提供的校验方法与java提供的校验方法 1. 声明数据 String str "123" String regex "^123456$" Boolean is1_6 mismatch(str, regex);2. 定义校验方法 // 校验是否不符合正则格式 private static boolean mismatch(String str, String rege…...
AI预测小分子与蛋白的相关特征: MegaMolBART, MoFlow,ESM-1, ESM-2
1、小分子:MegaMolBART, MoFlow 1)MegaMolBART https://github.com/NVIDIA/MegaMolBART 基于 SMILES 的小分子药物发现与化学信息学深度学习模型。 2)MoFlow https://github.com/calvin-zcx/moflow 用flow流方式分子生成 2、蛋白质:ESM-1, ESM-2 https://github.com/fa…...
基于深度学习的花卉检测系统(含PyQt界面)
基于深度学习的花卉检测系统(含PyQt界面) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现参考资料 前言 本项目是基于swin_transformer深度学习网络模型的花卉检测系统,…...
深度学习图像处理基础工具——opencv 实战信用卡数字识别
任务 信用卡数字识别 穿插之前学的知识点 形态学操作 模板匹配 等 总体流程与方法 1.有一个模板 2 用轮廓检测把模板中数字拿出来 外接矩形(模板和输入图像的大小要一致 )3 一系列预处理操作 问题的解决思路 1.分析准备:准备模板&#…...
【HBase】HBase高性能架构:如何保证大规模数据的高可用性
HBase高性能原理 HBase 能够提供高性能的数据处理能力,主要得益于其设计和架构的几个关键方面。这些设计特点使得 HBase 特别适合于大规模、分布式的环境中进行高效的数据读写操作。以下是 HBase 高性能的主要原因: 1. 基于列的存储 HBase 是一个列式…...
JAVA基础两个项目案例代码
1.JAVA使用ArrayList上架菜品案例 视频参考链接 创建一个Food.java类 package org.example;// 菜品类 public class Food {private String name; // 菜品名private double price; // 价格private String desc; // 菜品描述public Food() {}public Food(String name, Double …...
asp.net core 网页接入微信扫码登录
创建微信开放平台账号,然后创建网页应用 获取appid和appsecret 前端使用的vue,安装插件vue-wxlogin 调用代码 <wxlogin :appid"appId" :scope"scope" :redirect_uri"redirect_uri"></wxlogin> <scri…...
【板栗糖GIS】如何给微软拼音输入法加上小鹤双拼
【板栗糖GIS】如何给微软拼音输入法加上小鹤双拼 用过在注册表里新建的方法,结果弄完没有出现小鹤双拼方案,想到了自己写reg表 目录 1. 新建一个txt文件 2. 把.txt的后缀名改成.reg,双击运行 3. 在设置中找到微软输入法-常规 1. 新建一个…...
如何解决微信小程序无法使用css3过度属性transition
由于微信小程序不支持CSS3过度属性transition,所以我们需要利用微信小程序api进行画面过度的展示 首先是官方示例: wxml: <view animation="{{animationData}}" style="background:red;height:100rpx;width:100rpx"></view> js: Page(…...
【软件设计师知识点】九、网络与信息安全基础知识
文章目录 计算机网络的概念网络分类网络拓扑结构网络体系结构ISO/OSI 7层参考模型TCP/IP 4层模型TCP/IP 协议族应用层协议传输层协议网络层协议IP 地址IPV4 数据报IP 地址分类子网划分子网掩码IPv6地址...
广东省道路货物运输资格证照片回执可手机线上办理
广东省道路运输资格证是从事道路运输业务、危险品道路运输人员的必要证件,而在办理该证件的过程中,驾驶员照片回执是一项必不可少的材料。随着科技的发展和移动互联网的普及,现在办理驾驶员照片回执已经不再需要亲自前往照相馆,而…...
【微信小程序——案例——本地生活(列表页面)】
案例——本地生活(列表页面) 九宫格中实现导航跳转——以汽车服务为案例(之后可以全部实现页面跳转——现在先实现一个) 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图: 动态设置标题内容—…...
【设计模式】SOLID设计原则
1、什么是SOLID设计原则 SOLID 是面向对象设计中的五个基本设计原则的首字母缩写,它们是: 单一职责原则(Single Responsibility Principle,SRP): 类应该只有一个单一的职责,即一个类应该有且只…...
基于java+springboot+vue实现的智能停车计费系统(文末源码+Lw+ppt)23-30
摘 要 随着人们生活水平的高速发展,智能停车计费信息管理方面在近年来呈直线上升,人们也了解到智能停车计费的实用性,因此智能停车计费的管理也逐年递增,智能停车计费信息的增加加大了在管理上的工作难度。为了能更好的维护智能…...
IntelliJ IDEA 2022.3.2 解决decompiled.class file bytecode version:52.0(java 8)
1 背景 使用idea 打开一个Kotlin语言编写的demo项目,该项目使用gradle构建。其gradle文件如下: plugins {id javaid org.jetbrains.kotlin.jvm version 1.8.20 } group me.administrator version 1.0-SNAPSHOTrepositories {mavenCentral()jcenter()…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
