zoukankan      html  css  js  c++  java
  • JVM知识点汇总备忘

    GC算法

    参考文章
    在这里插入图片描述

    Serial

    串行,单线程垃圾收集器,STOP the World现象. client 默认新生代算法,实现简单,单核环境效率高复制算法:新生代 8:1:1 minorGc, 1/10分配给suviror幸存者。

    ParNew

    多线程版本的Serial收集器,多用在server端的新生代收集器

    mark&sweep 标记+清除

    mark&compact 标记+整理

    cms concurrent mark sweep

    在这里插入图片描述

    g1 garbage first

    G1 是一款面向服务端应用的垃圾收集器,它没有新生代和老年代的概念,而是将堆划分为一块块独立的 Region。当要进行垃圾收集时,首先估计每个 Region 中垃圾的数量,每次都从垃圾回收价值最大的 Region 开始回收,因此可以获得最大的回收效率。从整体上看, G1 是基于“标记-整理”算法实现的收集器,从局部(两个 Region 之间)上看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。
    每个 Region 都有一个 Remembered Set,用于记录本区域中所有对象引用的对象所在的区域

    GC过程

    新生代 --minorGC

    • MinorGC 的过程(复制->清空->互换),年龄+1,
    • 16次还存活移到old区。
    • Eden
    • from Survivor
    • to survivor

    老年代–Full GC

    • MajorGC 采用标记清除算法
    • 大对象、对象的年龄达到老年的标准

    PermGen

    • 存放 Class 和 Meta(元数据)的信息

    垃圾回收算法

    • 垃圾确认
    • 引用计数法-循环引用问题
    • 可达性分析,GC root两次标记确认
    • Mark Sweep-标记、清除两个阶段
    • 内存碎片化严重

    复制算法

    • 内存一分为二,满则移动存活的对象到另一半内存,清除当前。
    • 利用率低,存活对象多,效率低。

    标记整理算法

    • 标记阶段
    • 整理阶段把存活的对象移动到一端

    分代收集算法

    • 新生代
    • 复制算法,大部分对象要回收,复制的数据量少
    • 老年代
    • 标记复制算法,回收的对象少,移动的数据少。

    四种引用类型

    • 强引用
      强绑定,不会被GC回收
    • 软引用 SoftReference
      内存足够时不会回收,不够时会回收
    • 弱引用 WeakReference
      不管 JVM 的内存空间是否足够,总会回收该对象占用的内存
    • 虚引用
      PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。 虚引用的主要作用是跟踪对象被垃圾回收的状态

    Java 内存区域透彻分析

    在这里插入图片描述
    线程内存:java内存模型中的线程的工作内存是CPU的寄存器和高速缓存的一个抽象描述
    主内存
    数据总线 一致性协议

    为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。
    链接
    内存模型解决并发问题主要采用两种方式:限制处理器优化和使用内存屏障
    JMM
    零拷贝(Zero-copy)及其应用详解
    参考文章

    常用 jvm 参数分析

    通过参数 -XX:GCTimeRadio 设置垃圾回收时间占总 CPU 时间的百分比。
    通过参数 -XX:MaxGCPauseMillis 设置垃圾处理过程最久停顿时间。
    通过命令 -XX:+UseAdaptiveSizePolicy 开启自适应策略。
    只要设置好堆的大小和 MaxGCPauseMillis 或 GCTimeRadio,收集器会自动调整新生代的大小、Eden 和 Survivor 的比例、对象进入老年代的年龄,以最大程度上接近我们设置的 MaxGCPauseMillis 或 GCTimeRadio。
    参考文章

    如何利用 VisualVM 对高并发项目进行性能分析

    参考文章

  • 相关阅读:
    遍历切片slice,结构体struct,映射map,interface{}的属性和值
    [转]Go语言string,int,int64 ,float之间类型转换方法
    [转] golang中struct、json、map互相转化
    [转]Jupyter默认目录和默认浏览器修改
    sublime text3输出窗口中文显示乱码问题解决方案
    Oracle 在SQL语句中如何获取系统当前时间并进行操作
    eclipse调试的时候怎么后退?
    外部无法访问虚拟机8088和50070端口
    hadoop启动后jps查不到namenode的解决办法
    Java给整数部分的字符串加上千分位分隔符
  • 原文地址:https://www.cnblogs.com/coding-now/p/14660569.html
Copyright © 2011-2022 走看看