文章插图
我们做简单介绍:
- 黑色是已经标记结束的内存
- 灰色是正在标记的内存
- 白色是未标记的内存
- 最左侧是根,黑色,已经被标记
- 上方为根的直接/间接引用对象 , 黑色,已经被标记
- 下方为根的直接/间接引用对象,灰色,正在标记 , 白色,还未被标记当后面会被标记
- 最右侧孤零零的白色方块,没有被引用,不会被标记,最后会被当作垃圾回收对象处理掉
- 如果最右侧的方块在针对自身的CPU的并发标记结束后 , 又被其他进程所调用了(并发标记其他CPU正常运行)
- 但是此时它是白色的,最终会被这次的垃圾回收操作清除掉,就会导致影响其他进程操作
- 如果在该方块针对自身的并发标记结束后又被其他进程调用,这时将他拖入一个队列中,并将其变为灰色
- 在并发标记结束后进入重新标记阶段,就会检查该队列 , 若发现灰色对象,在队列中将它变为黑色对象并排出队列
JDK 8u20 字符串去重我们首先要明白字符串在底层是采用char数组形成的:
String s1 = new String("hello"); // char[]{'h','e','l','l','o'}String s2 = new String("hello"); // char[]{'h','e','l','l','o'}
如果重复的字符串都存放在内存中肯定会导致内存多余占用,所以提供了解决方案:- 将所有新分配的字符串放入一个队列
- 当新生代回收时,G1并发检查是否有字符串重复
- 如果它们值一样,让它们引用同一个 char[]
- 注意与 String.intern() 不一样:一个底层针对String类型 , 一个底层针对char[]类型
- 优点:节省大量内存
- 缺点:略微增多了CPU时间 , 新生代回收时间略微增多
这时如果一个类加载器的所有类都不再使用时,我们就可以卸载它所加载的所有类
JDK 8u60 回收巨型对象首先我们介绍一下巨型对象的定义:
- 一个对象大于 region 的一半时,称之为巨型对象
然后我们再来介绍G1对巨型对象的处理方法:
- 回收时被优先考虑
- G1 不会对巨型对象进行拷贝
- G1 会跟踪老年代所有 incoming 引用,这样老年代 incoming 引用为0 的巨型对象就可以在新生代垃圾回收时处理掉
基本调优概念我们进行调优需要掌握的基本知识:
- 掌握相关工具使用
- 掌握基本的空间调整
- 掌握GC相关的VM参数
- 明白调优并非固定公式 , 而是需要结合应用,环境
- IO调优
- 锁竞争调优
- CPU占用调优
- 是为了保证低延迟还是为了保证高吞吐量
如果我们频繁发生GC操作 , 那么我们就需要先进行自我反思:
- 存放的数据是否过多?
/*例如我们是否设置了相同元素筛?。看砦笳撕沤够捍妫?*/
- 数据表示是否臃肿?
/*例如我们调取数据时是否只调取了我们所需数据还是全盘托出?例如我们选择数据类型时是否是以最低标准为要求,数据库能采用tiny不要使用int*/
- 是否存在内存泄露?
/*例如我们是否设置缓存数据时采用了Static形式的Map并不断存储数据?*/
新生代调优首先我们先来回顾一下新生代的优点:- 所有的new操作的内存分配十分廉价:直接new出来存放在伊甸区即可
- 死亡对象的回收代价为零:我们直接采用复制将幸存内存复制出来即可,其他垃圾回收部分不用过问
- 大部分对象都是垃圾:我们实际上幸存下来的内存数据是小部分数据 , 所以大部分都是垃圾
- 垃圾回收时间相对短:Minor GC的时间远低于Full GC
推荐阅读
- 黑莓q5用安装微信的方法a 用黑莓自带的印象笔记手敲的 看不懂的宝宝们在私聊我吧
- JVM学习笔记——内存结构篇
- 【lwip】08-ARP协议一图笔记及源码实现
- 小米笔记本Pro15增强版评测_小米笔记本Pro15增强版评测表现
- 用一台笔记本电脑如何赚钱(笔记本电脑赚钱的办法)
- 四 【单片机入门】应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
- 笔记本电脑CF中烟雾头怎么调(win10cf新版本烟雾保护头怎么调)
- 笔记本电脑配置高低怎么区分(笔记本电脑看什么配置判断好坏)
- pytorch、paddlepaddle等环境搭建 深度学习环境搭建常用网址、conda/pip命令行整理
- 三十九 Java开发学习----SpringBoot整合mybatis