当前位置:网站首页>拿捏JVM性能优化(自己笔记版本)
拿捏JVM性能优化(自己笔记版本)
2022-08-04 03:10:00 【是老薛啊】
1.什么是JVM
是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 主流虚拟机
为什么要进行优化JVM?
因为我们的java代码都是运行在jvm上面的,所以要让代码运行的效率很快,那就让jvm优化跑的快,所谓的优化也就是进行一些参数的配置
2.JVM的组成
从上图看可以大致看出大致有:
3类加载器子系统
是什么?
就是用于加载类的一个子系统而已
3.1关于类加载器子系统的加载过程(常见的一道面试题)
A加载----我(第一人称类加载器)先去寻到字节码文件然后进行读取在内存上面,我有两种加载的方式,方式一 ,隐式加载只要你是new去创建对象的,我就隐式的把对应的类加载到jvm里,方式二,显示加载我直接就通过class.forName()方法把这个类加载到jvm里
B验证---当我把这个类加载到jvm里的时候,我要验证这个字节码文件是不是真的字节码,我通过元数据,字节码,符号引用等进行验证
C准备--当验证完你是一个真正的字节码文件之后,我还会先去看看你的类里面有没有被static修饰的变量,有那我就先给你分配内存空间并且初始值设置为0或null,如果在这里你有自己的赋值,我在这里还是给你内存空间和初始值,因为第五步在赋值你自己的值,这里只是给你分配内存空间,如果你即有final和static修饰,那在这里就直接给你赋值
D解析--刚刚在进行验证的时候有进行符号引用验证,这里是把你类里面有些符号引用的(比如引用完全限定名)直接去引用
E初始化--对在准备阶段里面的一些变量进行初始化的赋值
3.2类的加载器有哪些
3.3加载的顺序:
4种加载器那他的加载顺序是怎么样的呢?
双亲委派:
大致意思是:一层一层进行使用类加载器,先从老大启动类加载器去寻找这个类有就加载,没有就到老二扩展类加载器进行寻找加载,有加载没有到老三应用类进行加载,有加载,无到自定义加载器加载,还有没有的话,就报ClassNotFountException错误。
为什么要这样呢?
为了安全,为了系统中的类不会被覆盖,优先加载到虚拟机上面,同时也保证了我们扩展我们的功能
4.运行时数据区
4.1程序计数器
注意:它不是用来计数的,它是用来确定指令的执行顺序,是唯一 一个jvm没有规定任何OOM的区块(所以不会发生内存溢出的区域)我的理解是好比是4x100的接力比赛,它就是每个选手之间指引,指引下一步的发生,通过程序计数器,将一个个选手完成接力,可以连接成一个完整的接力比赛,从而完成整个比赛的执行
包括任何的分支、循环、跳转、异常处理、线程恢复等操作都需要依赖于当前线程的程序计数器来指引
4.2虚拟机栈
每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用,是线程私有的
虚拟机会为每个线程分配一个虚拟机栈,每个虚拟机栈中都有若干个栈帧,每个栈帧中都存储了局部变量表,操作数栈,动态链接,返回地址等
每个方法执行,伴随着进栈
方法执行结束后,伴随着出栈。
对于栈来说会有内存溢出的问题
本地方法栈和虚拟机栈其他一样,不同的点在于虚拟机栈执行的是java方法,本地方法栈执行的是本地方法(Native Method)
4.3方法区
方法区主要是来存储虚拟机架子啊的类信息,常量,静态变量,及一些编译之后的代码等,
在jdk1.3-1.6之间方法区是堆的一个逻辑部分
为了和堆的区分也叫永久性
在jdk1.7把原来在方法区里面的静态变量和字符串常量移到堆内存中
在jdk1.8之后方法区不存在,将原来的东西给移送到元空间,元空间没有存在于堆内存上,而已在本地的内存上
4.4堆空间
堆空间是一个所有的线程都共享的,存放对象的区域
5 垃圾回收机制-GC
5.1垃圾回收识别算法
因为不是所有的东西都是垃圾,所有要先进行识别是不是垃圾要进回收
A-引用计数算法(标记):
给每一个对象一个计数器,当有人用它的时候就在计数器上+1,当有一个地方不在使用它的时候就-1
弊端:如果是两个对象相互的引用,其他地方都没有在引用这两个对象,那就无法进行判断这两对象是否有用
B-可达性分析算法:
可达性算法是根据GC Root 的对象为起点出发 GC Roots是垃圾收集的起点,比如虚拟机栈里面的本地变量表中引用的对象,或者是方法去静态属性引用的对象,方法区中常量引用的对象,本地方法里的对象都可作为GC Root
当一个对象没有引用链直接或间接到GC Roots 说明这个对象为死对象可被回收
如图:D,E没有任何的引用链,所以会被回收
注意:虽然D E 没有到GC的引用链 但是当达成可达性分析算法时,会先判断对象是否执行了 finalize 方法,如果未执行,则会先执行 finalize 方法,我们可以在此方法里将当前对象与 GC Roots 关联,这样执行 finalize 方法之后,GC 会再次判断对象是否可达,如果不可达,则会被回收,如果可达,则不回收!(finalize 方法只会被执行一次)
5.2垃圾回收算法
A-标记清除
两步走:1.先把要进行清除的对象进行标记,2.把标记的对象进行清除
弊端:两个过程,效率不高,清除之后还有很多内存碎片不干净
B-复制算法
先把内存分为相等的内存空间A和B,当A的空间用完,把这侧的存活的对象复制到B,再把A的内存空间全部清理
弊端:实际使用的空间少一半
C-标记整理算法
先把可以用的对象进行标记,然后把所以被标记的对象向一段移动,最后清除可用对象边界以外的内存
D-分代收集算法
新生代使用minor gc 老年代使用full gc
E-Minor GC 和Full GC
Minor GC 是新生代使用的回收算法,这种回收很快,
Full GC 是老年代使用的回收算法,并且会伴随至少一次的Minor GC 这种的每次暂停时间比较长,
5.3常见的垃圾收集器
A-Serial 新生代收集器
采用复制算法进行垃圾收集,当在进行垃圾收集的时候,会使所以的线程必须暂停
B-ParNew 新生代收集器
是Serial的多线程的版本,基本和Serial一样,相比于Serial 它是尽可以去缩短所以线程的等待时间
C-Parallel Scavenge 新生代收集器
是多线程的收集器,它是尽可能去达成一个可控制的吞吐量,(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))
D-Serial Old 老年代收集器
是单线程收集器,采用的是标记整理算法
E-CMS 老年代收集器
主要的目的是最短回收停顿时间为目的的收集器
F-G1 收集器
G1 不同于其他的收集器不是新生代和老年代的,是整个堆内存的
5.4JVM的优化的主要的核心:使用较小的内存占用来获得较高的吞吐量或者较低的延迟
后续更新,优化的具体方式和设置相关的参数,这里目的让读者大致了解JVM和为什么要进行优化
欢迎进行学习交流,不足之处请指出,喜欢麻烦点赞+收藏,谢谢各位大佬了
边栏推荐
- Basic form validation process
- unsafe.Pointer, pointer, reference in golang
- 数据集类型转换—TFRecords文件
- 2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机
- 自定义通用分页标签01
- Power button (LeetCode) 215. The first K largest elements in the array (2022.08.03)
- Pine脚本 | 如何显示和排版绘图开关?
- The general SQL injection flow (sample attached)
- Exclude_reserved_words 排除关键字
- 打造一份优雅的简历
猜你喜欢
数组相关 内容 解析
STM8S105K4T6------Serial port sending and receiving
STM8S105K4T6------串口发送和接收
STM8S project creation (STVD creation) --- use COSMIC to create a C language project
目标检测-中篇
base address: environment variable
出现504怎么办?由于服务器更新导致的博客报504错误[详细记录]
Ant - the design of the Select component using a custom icon (suffixIcon attribute) suffixes, click on the custom ICONS have no reaction, will not display the drop-down menu
2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机
Functions, recursion and simple dom operations
随机推荐
QNX Hypervisor 2.2 user manual] 10.1 gm vdev options
How to read the resources files in the directory path?
【医保科普】维护医保基金安全,我们可以这样做
打造一份优雅的简历
【翻译】Terraform和Kubernetes的交集
Sfdp 超级表单开发平台 V6.0.5 正式发布
C语言--环形缓存区
查看mysql死锁语法
y86.第四章 Prometheus大厂监控体系及实战 -- prometheus存储(十七)
网络工程师入门必懂华为认证体系,附系统学习路线分享
【指针内功修炼】深度剖析指针笔试题(三)
数据安全峰会2022 | 美创DSM获颁“数据安全产品能力验证计划”评测证书
keytool命令
异步编程解决方案 Generator生成器函数、iterator迭代器、async/await、Promise
MRS: Alluxio的使用介绍
MySQL查询优化与调优
JVM内存和垃圾回收-07.堆
2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机
返回字符串中的最大回文数
Mini program + new retail, play the new way of playing in the industry!