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()…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...