当前位置: 首页 > article >正文

【JVM】垃圾回收与安全点 学习记录

1.什么是安全点

安全点是一种特殊的执行位置,在这些位置,JVM可以安全地停止线程来进行全局性的操作,比如垃圾回收。在这些点上,程序的状态是已知的并且稳定的,这意味着JVM可以暂停所有线程而不用担心破坏程序的一致性

2.那些可以作为安全点

1.方法调用完成后
2.循环体末尾
3.异常处理后
4.其他任何会导致程序状态变更后的地方

3.代码演示

public static void foo() {
  System.out.println("foo方法开始执行====");
  long start = System.currentTimeMillis();
  for (int i = 0; i < 0x77777777; i++) {
    sum += Math.sqrt(i);
  }
  System.out.println("foo - >"+(System.currentTimeMillis()-start));
}

public static void bar() {
  System.out.println("bar方法开始执行====");
  long start = System.currentTimeMillis();
  for (int i = 0; i < 50_000_000; i++) {
    new Object().hashCode();
  }
  System.out.println("bar - >"+(System.currentTimeMillis()-start));

}

public static void main(String[] args) {
  //分别单独执行
  new Thread(SafepointTest::foo).start();

  new Thread(SafepointTest::bar).start();
}

博主电脑单独执行 foo,跑完输出 foo - >2840

​ bar - >2660

如果同时跑

​ foo - >2863

​ bar - >5518

可以发现 bar 方法从开始到结束所花费时间提供了近两倍。这是由于 bar() 不停的创建 new Object()对象,并调用hashCode方法,将会触发GC回收,而GC线程进行回收时,需要等待 其他线程都进入安全点(foo 线程循环结束),因此 bar() 方法执行时间大大增加。

4. UseCountedLoopSafepoints

可以添加 -XX:+UseCountedLoopSafepoints JVM参数进行优化

当启用 -XX:+UseCountedLoopSafepoints 选项时,JVM 会在循环中插入安全点,但这些安全点是基于循环迭代次数的计数器来确定的。这意味着,循环中的每个迭代不一定都会成为一个安全点,而是每隔一定次数的迭代才会插入一个安全点

http://www.kler.cn/a/286758.html

相关文章:

  • 08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)
  • 开源鸿蒙开发者社区记录
  • 【Prometheus】Prometheus如何监控Haproxy
  • Scrapy之一个item包含多级页面的处理方案
  • Genetic Prompt Search via Exploiting Language Model Probabilities
  • 【若依】添加数据字典
  • 鸿蒙( Beta5版)开发实战:基于AVCodecKit【音视频解码】
  • 数据仓库系列19:数据血缘分析在数据仓库中有什么应用?
  • Java、python、php版 保险业务管理与数据分析系统 社会保险档案管理系统(源码、调试、LW、开题、PPT)
  • 基于SSM+Vue+MySQL的二手房中介管理系统
  • 驱动(RK3588S)第二课时:引导程序和内核
  • Linux 软硬连接
  • Zynq之IIC使用示例
  • Multisim 仿真入门
  • (已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection
  • 以基于Prometheus和Grafana的现代服务器监控体系构建
  • Flutter中组件动态可见的实现
  • Java 入门指南:Java 并发编程 —— AQS、AQLS、AOS 锁与同步器的框架
  • 智能报警物联网系统:使用MQTT和与Grafana集成的InfluxDB监控工地电梯流量和气象数据
  • 用AI生成旅游打卡照!FLUX假装去旅行lora的使用【附工作流】
  • flutter封装Dio使用
  • 计算机毕业设计选题推荐-医疗就诊平台-在线医疗问诊系统-Java/Python项目实战
  • 【硬件操作入门】3--同步与异步、半双工传输、UART硬件介绍、bps速率计算
  • linux 文件管理命令
  • 【Tools】二叉树中序遍历
  • DOM 方法:深入解析与实用指南