JVM优化

Java编码执行流程图

在这里插入图片描述

a.java
->javac(前端编译器,javac属于其中一种)
->a.class
和java类库
->classloader->
Java解释器(一行行解释并运行)
或即时编译器JIT(Just In Time,属于后端编译器)JIT可以将一个方法(热点代码)中所有的字节码编译成机器码,放在缓存中,然后需要的时候拿出来直接用		   
判断热点代码的方式是:热点探测JDK:jre+development kit
JRE:jvm+core lib
JVM

JVM实现

hotspot1.8以后收费,开源版openJDK
jrockit,被oracle收购,合并于hotspot
taobaoJVM

JVM内存

JVM内存:
1,虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等
栈的大小可以固定也可以动态扩展。
当栈调用深度大于JVM允许的范围,会抛出StackOverflowError
2,本地方法栈
3,PC寄存器:记录当前程序执行到哪一步
4,堆:存放所有的对象和数组。
分为新生代(伊甸园、存活区)占1/3堆空间、老年代占2/3堆空间
5,方法区:所有线程共享。用于存储类的信息、常量池、方法数据、方法代码等。
方法区逻辑上属于堆的一部分,但是为了与堆区分,又叫“非堆”
JDK1.8之前方法区的实现是永久代,JDK1.8之后分方法区的实现是元空间(元空间本地存储)

永久代、元空间?

元空间和永久代概念?
元空间和永久代类似,都是JVM规范中方法区的实现
永久代是JVM虚拟机中一块内存空间,可以设置大小,在内存不够时会触发FullGC,也就是和老年代同时垃圾回收
元空间不属于JVM内存,而是使用本地内存,默认是可以无限制使用本地内存,也可以通过参数限制内存使用大小
元空间为什么代替了永久代?
1,字符串存在永久代中,容易出现性能问题和内存溢出。
2,类及方法的信息比较难确定其大小,永久代大小指定比较困难,太小容易出现永久代溢出,太大容易造成老年代溢出
3,永久代会为GC带来不必要的复杂度,并且回收效率偏低。

string声明的字面量数据都放在字符串常量池中
jdk1.6中字符串常量池存放在方法区(永久代中)
jdk1.7及以后字符串常量池存放在堆空间

intern()
如果不是用双引号声明的String对象,可以使用String提供的intern方法。
intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中

String str1 = new String("hello");
//将字符串放在常量池中
String intern = string.intern();
//直接从常量池获取
String str2 = "hello";//字面量赋值
System.out.println(str1==str2);//false
System.out.println(intern==str2);//true

堆栈?

栈:方法调用(自动释放)、变量名
堆:new出的对象
在这里插入图片描述

为什么不把基本数据类型放在堆中?

1,栈比堆运算效率快,但是堆空间比栈空间大
2,将复杂的数据类型放在堆中目的是不影响栈运行效率,通过引用的方式去堆中找。
3,基本数据类型占用内存少,放在栈空间中,能够提高效率。

GC

垃圾回收算法:mark-sweep标记清除、copying拷贝、mark-compact标记压缩
在这里插入图片描述
Java1.8默认PS+PO,Java1.9默认G1

内存模型

分代模型:

新生代1/3:coping算法,比例为8:1:1,eden(伊甸区8):survivor1:survivor1

新生代采用coping算法,
比如先给eden区new10个对象,然后回收9个对象,将剩余的1个放到survivor,这时eden区又为空
然后在eden区new10个对象,再回收时,回收eden区和第一个survivor区,将不需要回收的对象放在第二个survivor区

老年代2/3:随着在新生代中年龄增长(PS+PO:15次,CMS:6次)放到老年代中
Full GC(Full Garbage Collection):当老年代的空间占用达到一定阈值时,JVM 可能会触发 Full GC 来对整个堆(包括新生代和老年代)进行回收。Full GC 会扫描整个堆内存,包括老年代,以释放未被使用的对象占用的内存。
CMS GC(Concurrent Mark-Sweep Garbage Collection):在使用 CMS 垃圾收集器时,老年代的回收通常是通过 CMS 的并发标记清除算法来实现的。这种方式允许在应用程序运行的同时进行老年代的回收操作,以减少停顿时间。
G1 GC(Garbage-First Garbage Collection):G1 垃圾收集器通过划分堆内存为多个区域来管理内存,其中包括老年代。G1 GC 会根据堆内存的使用情况动态地选择哪些区域进行垃圾回收,而不是简单地依赖于年龄或者固定的老年代回收阈值。
在这里插入图片描述

分区模型:
JVM内存分成不同区域region

serial单线程+serial old垃圾回收组合

serial:a stop-the-world,copying collector which use a single GC thread
serial old:a stop-the-world,mark-sweep-compact collector what use a single GC thread

内存几十兆时:
serial单线程stw(stop the world)垃圾回收
serial采用copying拷贝算法,
serial old采用mark-sweep标记清除、mark-compact标记压缩

parallel并行 scavenge+parallel old垃圾回收组合

parallel scavenge: a stop-the-world,copying collector which use a multiple GC thread
parallel old: a stop-the-world,mark-sweep-compact collector that use a multiple GC thread

parallel并行(其实就是多线程同时垃圾回收)
内存几百兆~1G时:
并行多线程
PS+PO组合
JDK1.8默认垃圾回收线程
在需要垃圾回收时,多个线程同时干活
但是不能无限增加垃圾回收线程数量,因为线程切换需要花费时间

CMS+ParNew垃圾回收组合

CMS:concurrent-mark-sweep并发标记清除
内存:20G
Concurrent GC 并发垃圾回收
并发:指GC线程和业务线程同时进行
CMS适用于老年代

在这里插入图片描述

三色标记算法

黑色标记对象A:对象A和子属性都已完成标记
灰色标记对象B:对象B已完成标记,但是子属性没有完成
白色标记对象D:对象D和子属性都没有完成标记

incremental update增量更新

A的子属性是BB的子属性是D时,如果BD之间断开关联,AD之间增加关联时,
需要将黑色标记对象A,改成灰色。这称为CMS解决方案incremental update增量更新

incremental update增量更新bug

但是CMS存在bug,
当垃圾回收线程t1标记完成对象A、子属性A1并且正在标记子属性A2时,
切换至业务线程t2,t2给对象A将子属性A1指向白色对象,
切换至垃圾回收线程t3,把对象A标记为灰色
切换回垃圾回收线程t1继续标记完子属性A2时,就会把A标记成黑色。
导致对象D漏标
需要在重新标记RemarkSTW,浪费时间

G1

内存:上百G
垃圾处理时间号称200ms
G1:garbage first首先回收垃圾特别多的区域
是一个老年代和新生代共用的垃圾回收器
G1采用局部收集的回收思想。将Java堆内存划分成多个相同大小的独立region区域。
物理上不分代,但是分区,逻辑上分代
G1分region回收,优先回收花费时间少,垃圾比例高的region
新老年代比例一般不用手动指定G1也采用三色标记,但是将incremental update增量更新升级为SATB(snopshot at the begining)

SATB(snopshot at the begining)

SATB(snopshot at the begining)
在起始时做一个快照,当B->D消失时,要把这个引用推到GC的堆栈,保证D还能被GC扫描到,
配合Rset(remember set记忆集,region分区有10~15%区域用于记录哪些分区有引用当前分区),
只用扫描哪些region引用到了D这个region,如果全部不指向D,那么D就是垃圾。
如果有别的对象指向DD就保留下来

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

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

相关文章

SpringBoot多数据源切换 多数据源事务解决方案 二

https://zhuanlan.zhihu.com/p/612825647?utm_id0 https://blog.csdn.net/guzhangyu12345/article/details/108559810 SpringBoot多数据源事务解决方案 https://blog.csdn.net/u013407099/article/details/124526396多数据源切换下保证事务解决方案 https://blog.csdn.net/re…

郑州大学2024年3月acm实验室招新赛题解(A-L)

这里感谢一下计算机学术交流协会会长,acm实验室的中坚成员,以及本次比赛的出题人之一孙昱涵将他的账号借给了我。 回顾一下的话,这场的难度其实不是很大,不过对招新的新手来说难度还是挺大的。去掉签到都没签出来的选手的话&…

【C++ Primer Plus学习记录】第6章复习题

1.请看下面两个计算空格和换行符数目的代码片段: //Version 1 while(cin.get(ch)) //quit on eof,EOF(检测文件尾) { if(ch )spaces;if(ch \n)newlines; }//Version 2 while(cin.get(ch)) //quit on eof { if(ch )spaces;else if(ch \n)newlines; } 第…

C++_异常

目录 1、异常的关键字 2、异常的写法 3、异常的使用规则 3.1 规则1 3.2 规则2 3.3 规则3 3.4 规则4 3.5 规则5 4、异常的重新抛出 5、异常的规范 5.1 C98的异常规范 5.2 C11的异常规范 6、C标准库的异常体系 7、异常的优缺点 结语 前言: C的异常…

学习数据节构和算法的第15天

单链表的实现 链表的基本结构 #pragma once #include<stdio.h> typedf int SLTDataType; typedy struct SListNode {SLTDataType data;struct SListNode*next; }SLTNode;void Slisprint(SLTNode*phead);打印链表 #include<stdio.h> void SListPrint(SLTNode*phe…

详解DSLS达索许可管理器的安装与配置

DSLS的安装与配置 一、DSLS下载二、安装DLS三、使用DSLS四、更改计算机ID五、部分常见DSLS相关问题 一、DSLS下载 下载地址&#xff1a;https://software.3ds.com/?ticketST-5190987-dUM0dflc6zfjf04F5EXx-cas 注意&#xff1a;需要一个注册了的达索账号才能登录进去下载 一…

飞塔防火墙开局百篇——002.FortiGate上网配置——透明模式配置(Transparent)

透明模式配置 开启透明模式创建策略 在不改变现有网络拓扑前提下&#xff0c;将防火墙NGFW以透明模式部署到网络中&#xff0c;放在路由器和交换机之间&#xff0c;防火墙为透明模式&#xff0c;对内网网段192.168.1.0/24的上网进行4~7层的安全防护。 登陆FortiGate防火墙界面&…

24.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-根据配置文件自动生成C语言头文件

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;23.实现配置工具…

【infiniband监控】grafana变量使用细化优化监控指标

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

Bitmap实现原理应用场景

Bitmap是什么&#xff1f; 用内存中连续的二进制位&#xff08;bit&#xff09;&#xff0c;用0或1标识数据是否存在。 长度为10的bitmap&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 在bitmap中存在。 Bitmap实现 1、字符串 数值对应字符串的下标、二进制位0&…

Centos7安装postgresql14步骤

1、进入网址 https://www.postgresql.org/download/ 2、按步骤执行 # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL: sudo yum install -y…

ST MotorControl Workbench 6.2.1 使用总结

目录 前言 软件安装 根据自己硬件配置参数 生成代码 开发板运行 ​ 总结 前言 好久没有玩ST的电机库了&#xff0c;已经更新到了MotorControl Workbench 6.2.1&#xff0c;6以上的版本比5的版本界面操作有很大的不同&#xff0c;核心算法有些增加。最近体验了一把使用自…

linux设置systemctl启动

linux设置nginx systemctl启动 生成nginx.pid文件 #验证nginx的配置&#xff0c;并生成nginx.pid文件 /usr/local/nginx/sbin/nginx -t #pid文件目录在 /usr/local/nginx/run/nginx.pid 设置systemctl启动nginx #添加之前需要先关闭启动状态的nginx&#xff0c;让nginx是未…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-4、线条平滑曲面(修改颜色)去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

I2C驱动AT24C02

文章目录 一、硬件电路设备地址 二、使用步骤字节写:页写入:任意写:任意读: 一、硬件电路 设备地址 设备需要一个8位的设备地址字&#xff0c;后面跟着一个启动条件&#xff0c;以使芯片能够进行读或写操作 设备地址字由一个强制的1,0序列的前四个最有效的位&#xff0c;如所示…

(二)运行自己的stable-diffusion

前面的步骤如https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b所示 拷贝、解压文件后&#xff0c;进入到stable-diffusion-webui的文件夹中&#xff0c;文件如下&#xff1a; 启动&#xff1a; 运行效果&#xff1a; 由于生成了好几个图&#xff0c;所以…

springboot的Converter和HttpMessageConveter

Converter和HttpMessageConveter是springboot和springmvc在处理请求的时候需要用到的。但是这两者的完全是不一样的&#xff0c;作用的地方也不一样。 1&#xff0c;springboot和springmvc处理请求的流程 先来回顾一下处理请求的流程&#xff1a; 用户向服务器发送请求&#…

Webbench,一个简单好用的web压力测试工具

Webbench 是一个简单且轻量级的Web服务器压力测试工具&#xff0c;它通过创建多个子进程来模拟多个客户端同时向服务器发送请求。运行平台是linux 安装Webbench: 1 下载Webbench源代码&#xff1a; wget http://www.ha97.com/code/webbench-1.5.tar.gz 2 解压源代码包&#…

焦点调制网络

摘要 https://arxiv.org/pdf/2203.11926.pdf 我们提出了焦点调制网络&#xff08;简称FocalNets&#xff09;&#xff0c;其中自注意力&#xff08;SA&#xff09;被焦点调制模块完全取代&#xff0c;用于在视觉中建模令牌交互。焦点调制包含三个组件&#xff1a;&#xff08;…