拿捏JVM性能优化(自己笔记版本)

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和为什么要进行优化

欢迎进行学习交流,不足之处请指出,喜欢麻烦点赞+收藏,谢谢各位大佬了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值