Java教程

学习笔记 2021.10.25

本文主要是介绍学习笔记 2021.10.25,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

2021.10.25

JVM

垃圾回收相关概念

system.gc的理解

image-20211025195613742

  • 当然回收的区域也包括方法区。
  • 免责声明的意思是不保证什么时候执行,即该方法的作用是提醒虚拟机希望执行垃圾回收行为。
  • 该方法与system.runfinalizationg方法后即会强制调用finalize方法,即可理解成强制执行了垃圾回收。

有两个例子理解下:

image-20211025200725441

一个是上面3和4的区别,3没有进行回收,而4进行了回收,可以理解成3和4中的局部代码块执行了过后局部变量在局部变量表中还存在着引用,只是没有显示。只有在外面再添加局部变量对其引用进行覆盖后才会使对象的引用消除。

image-20211025200903807

这个的解释即是某个方法中创建了引用和对象,但在方法执行完栈帧弹出后引用即没有了,从而再调用一次垃圾回收能够达到效果。

内存溢出

java中对oom的解释是:没有空闲内存,并且垃圾收集器也无法提供更多的内存。

image-20211025201203169

一般来说,内存没有空闲内存的情况,一般指java虚拟机的内存不够,原因有以下两种:

image-20211025201328442

然后就是针对内存溢出,垃圾收集器在特定的场景下也有一些针对性的操作:

image-20211025201510155

内存泄露

严格来说:只有对象不会再被程序用到,但是GC又不能回收他们的情况,才叫内存泄漏。

image-20211025202515247

  • 宽泛意义上的即是比如说Static定义的,如果不好好处理的话,会随着类的加载而创建,从而导致生命周期很长。

一些很常见的例子

image-20211025202747523

  • 即外部的资源都最好要手动去回收。

stop the world理解

image-20211025202924543

  • 作用就是防止在判断的时候具体情况又发生变化。
  • 这个操作是一定会发生的。
  • 尽管再好的垃圾回收器,都是无法避免的,只能说GC越来越优秀,回收效率越来越高,尽可能的缩短了时间。
  • 是在后台自动发起和自动完成的。
  • 调用system.gc也会导致stw的发生。

程序的并行与并发

并发的概念

image-20211025203401676

并不是并行!!每个时间段都是只有一个程序在进行的。

并行的概念:

image-20211025205229593

二者对比

  • 并发是多个事情在同一时间段上同时发生了,并行是指多个事情在同一时间点上同时发生了。
  • 并发是要抢资源的,但是并行不会。

垃圾回收的并发与并行

image-20211025205430017

具体的图示上面已经解释够清楚了。

垃圾回收的并发

image-20211025205526016

安全点与安全区域

安全点:

image-20211025205624619

简单理解即是能够发生stw进行垃圾回收的点。

线程跑到完全点停顿下来的时机的选择

image-20211025205817606

安全区域:

用于针对无法响应的线程如何实现垃圾回收的设计,使得在该区域中任何位置都能开始GC

image-20211025205936735

具体执行的细节:

image-20211025205957475

再谈引用

具体引入各种引用的出发点:

image-20211025210227026

大概的引用强度是按照强软弱虚这么一个顺序来排列的。

image-20211025210403354

具体四种引用类型的概述:

image-20211025210432876

  • 软引用:内存不足才回收。
  • 强引用:就算系统报oom也不会收,且容易导致内存泄露。
  • 弱引用:不管内存够不够,都回收。发现即回收。
  • 虚引用:主要关注其上面写的唯一目的。
强引用

即是平时最常见的引用关系,基本的概念其实在前面学习的过程中也是慢慢熟悉了的,基本就是做个总结即可。

image-20211025210935762

软引用

基本了解个概念就可以了

image-20211025211047341

  • 换个角度理解,软引用不会导致oom。
  • 在内存足够时不会去回收软引用。
  • 具体的创建和代码层面的实现有需求再细看,视频里面有举例。
弱引用

同样了解个概念即可:

image-20211025211417782

虚引用(对象回收跟踪)

image-20211025211705422

image-20211025211822744

  • 更多的是通知和记录的作用,具体的追踪的实现,有配套的方法,具体用到的时候再去详细了解。

插一个对不同版本的考虑

image-20211025212918519

垃圾回收器

GC的分类

  • 按线程数分:可分为串行和并行垃圾回收器。

image-20211025213008074

  • 按照工作模式分为:并发式和独占垃圾回收器

image-20211025213112155

其他的分类方法:

image-20211025213123955

评估性能指标

image-20211025213231206

  • 重点关注其中标红色的。
  • 基本的想法是吞吐量越大越好。
  • 收集频率根据实际情况而定,各自有优缺点
  • 其中标红的三点称为不可能三角,即不可能同时满足的指标,优秀的GC最多满足其中两项,其中暂停时间是最优先考虑的。
  • 如果只考虑两点,则是吞吐量和暂停时间。
吞吐量和暂停时间

image-20211025213801709

简单理解,即是两个指标是完全矛盾的

现在注重的指标设计:在最大吞吐量优先的情况下,降低停顿时间。

常见的垃圾回收器有哪些

开头:JVM有不同版本,对应着JVM搭配的GC的话,自然也有着不同类型的GC。再展开。

七款经典的垃圾回收器:

image-20211025215150901

后面的章节具体解释。

垃圾回收器的组合关系

即对于堆中不同区域的垃圾回收的分工:

image-20211025215405401

具体的组合关系的联系:

image-20211025215444352

  • csm和msc的线意思是可以作为后被方案,后面会详细说。
  • 红线是JDK8之后逐渐取消的组合。绿线也是。
  • 包括CMS这种GC也是remove了的。

JAVA采取这么多的GC,是因为使用场景很多,针对不同的场景,就是要采取不同的垃圾收集器。

选择的永远是对于具体应用最适合的垃圾收集器。

培养的即是选择适合的垃圾回收器的能力。

还有教怎么查看默认的垃圾回收器,有些兴趣可以去了解下。

Serial回收器

概述:

image-20211025220054172

  • 复制算法! 串行回收! STW! 作为关键点记住。
  • Serial old STW! 标记压缩算法! 也是要结合前面记住的。

基本的运行示例:

image-20211025220253563

单线程还有层意思即是执行时必须停止所有其他的进程。

相关的优缺点:

image-20211025220344313

缺点也是很明显的,在交互较强的应用中,这是完全没法接受的,仅在限定单核的情况下会使用他。

Parnew垃圾回收器

image-20211025221011468

  • 除了并行的区别外,与前面的Serial基本没有区别。包括复制算法等等。
  • 由于并行的原因,可以知道stw的时间是相对更短的。
  • 此时可以看到其合理性,对于新生代,回收次数频繁,使用并行的方式更高效,老年代不是那么频繁,用串行可以节约资源。
  • 自然的,也可以设置并行性的线程数量,最好数量小于cpu核的数量。

与Serial垃圾收集器的比较

image-20211025221312360

这篇关于学习笔记 2021.10.25的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!