JVM——堆

JVM学习路线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1s1mC1VC-1657780172408)(D:\Learn\java\JVM\堆.assets\image-20220611115347017.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JoSj1SoD-1657780172409)(D:\Learn\java\JVM\堆.assets\image-20220611115549990.png)]

堆的核心概述

一个进程一个堆,一个进程有多个线程,多个线程共享一个堆,

一个方法区。一个线程有自己的PC,本地方法栈,虚拟机栈

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kNMeu1Nm-1657780172409)(D:\Learn\java\JVM\堆.assets\image-20220611121705289.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Agwfv4v-1657780172410)(D:\Learn\java\JVM\堆.assets\image-20220611122702057.png)]

在方法结束后,队中的对象不会马上被移除,仅仅在垃圾手机的时候才会被移除。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LY6thCln-1657780172410)(D:\Learn\java\JVM\堆.assets\image-20220611122958757.png)]

堆,是GC执行垃圾回收的重点区域。

内存细分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xEqJQrZ2-1657780172410)(D:\Learn\java\JVM\堆.assets\image-20220611123601432.png)]

查看命令

jvisualvm

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tllyjreI-1657780172411)(D:\Learn\java\JVM\堆.assets\image-20220611132213289.png)]

jdk8 中内存结构的一个变化是永久区Perm变成元空间Meta

设置堆内存大小与OOM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpTgLQAi-1657780172411)(D:\Learn\java\JVM\堆.assets\image-20220611132928362.png)]

-X 是jvm的运行参数
ms memory start
-Xms 用来设置对空间(年轻代+老年代)的最大内存大小

查看设置参数
1、jps  jstat -gc 进程id
2、-XX:+PrintGCDeatils

在开发中建议把初始内存和最大内存设置为一样的值

(扩容和降容会造成系统的压力)

年轻代与老年代

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0qo5oHB-1657780172412)(D:\Learn\java\JVM\堆.assets\image-20220611145039241.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GV3FMSbI-1657780172412)(D:\Learn\java\JVM\堆.assets\image-20220611145152894.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bULOX9TM-1657780172413)(D:\Learn\java\JVM\堆.assets\image-20220611145926494.png)]

新生代中Eden : s0 : s1 = 8:1:1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZDeP2GUp-1657780172413)(D:\Learn\java\JVM\堆.assets\image-20220611150517631.png)]

常见的JVM命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6WnS21pt-1657780172413)(D:\Learn\java\JVM\堆.assets\image-20220611150656718.png)]

图解对象分配过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXXFMvmY-1657780172413)(D:\Learn\java\JVM\堆.assets\image-20220611151450147.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xosGrX5y-1657780172414)(D:\Learn\java\JVM\堆.assets\image-20220611151506548.png)]

总结
  1. 针对幸存者s0,s1区:复制之后有交换,谁空谁是to
  2. 关于垃圾回收:频繁在新生区收集,很少在养老去收集,几乎不在永久区/元空间收集

常见的调优工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4rIHb0l-1657780172414)(D:\Learn\java\JVM\堆.assets\image-20220611153552144.png)]

Minor GC、Major GC、Full GC

分别是新生代GC,老年代GC(MGC,FGC在某种意义上可以说是一样的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvoNz47s-1657780172414)(D:\Learn\java\JVM\堆.assets\image-20220611155219271.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxm3F9HI-1657780172415)(D:\Learn\java\JVM\堆.assets\image-20220611160220709.png)]

STW :可以理解为暂停制造垃圾

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RkV6uba-1657780172415)(D:\Learn\java\JVM\堆.assets\image-20220611160802311.png)]

调优的目的

减少GC,提高性能

堆空间分代思想

内存分配策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3trD8sf-1657780172415)(D:\Learn\java\JVM\堆.assets\image-20220611211642403.png)]

为对象分配内存:Tlab

在堆中为每个线程分配一个独有的内存空间,叫做TLAB

![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6jpJ0Hh-1657780172416)(D:\Learn\java\JVM\堆.assets\image-20220611212422684.png)\]](https://img-blog.csdnimg.cn/9657a96073f24d3195bcbac544d9fd27.png)

分配过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OyxJ8e5V-1657780172417)(D:\Learn\java\JVM\堆.assets\image-20220611212940455.png)]

小结堆空间的参数设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXgdUaCK-1657780172418)(D:\Learn\java\JVM\堆.assets\image-20220612110940965.png)]

堆是分配对象存储的唯一选择吗

## [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fumnj8pz-1657780172419)(D:\Learn\java\JVM\堆.assets\image-20220612112322247.png)]

逃逸

方法内部的变量会实例如果在方法外也被使用到,就是逃逸了,就不能使用栈赖存储而只能使用堆存储了。否则可以用栈赖储存,减轻堆的负担,进而达到了一个性能调优的目的!

避免逃逸的一个方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kzXKTtC1-1657780172419)(D:\Learn\java\JVM\堆.assets\image-20220612112952969.png)]

如何快速的分析是否发生逃逸分析,就看new的对象实体是否可以被外部调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtjkjIIk-1657780172420)(D:\Learn\java\JVM\堆.assets\image-20220612113152037.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZvH6M4j-1657780172420)(D:\Learn\java\JVM\堆.assets\image-20220612113200151.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOn3dArd-1657780172420)(D:\Learn\java\JVM\堆.assets\image-20220612113325899.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W0Xsb9UW-1657780172421)(D:\Learn\java\JVM\堆.assets\image-20220612113337493.png)]

结论:开发中能使用局部变量的,就不要使用在方法外定义。

栈上分配

开启逃逸分析后,如果程序中有很多代码端不会发生逃逸,则可以明显提高程序的性能!

:+DoEscapeAnalysis

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbVbv7ba-1657780172421)(D:\Learn\java\JVM\堆.assets\image-20220612114857885.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9D2nHGlz-1657780172421)(D:\Learn\java\JVM\堆.assets\image-20220612114910273.png)]

同步省略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-snnsBWPJ-1657780172421)(D:\Learn\java\JVM\堆.assets\image-20220612115030004.png)]

分离对象或标量替换

将聚合量(k,v) 分解成标量

EliminateAllocations

使用和不使用的效果对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lRNggocp-1657780172422)(D:\Learn\java\JVM\堆.assets\image-20220612115739652.png)]

小结

在这里插入图片描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值