【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 会在循环中插入安全点,但这些安全点是基于循环迭代次数的计数器来确定的。这意味着,循环中的每个迭代不一定都会成为一个安全点,而是每隔一定次数的迭代才会插入一个安全点
相关推荐
广东帝工智能安防7 分钟前
智能设防精准预警,筑牢内河桥梁通航安全防护网
安全·桥梁防撞·智慧航道·防撞预警系统
β添砖java41 分钟前
2025最新快速构建企业级虚拟专用网络环境学习笔记
笔记·学习
kali-Myon2 小时前
某校园门禁系统高危 SQL 注入漏洞挖掘复盘
数据库·sql·安全·web安全
志栋智能2 小时前
超自动化安全中的威胁狩猎
运维·安全·自动化
lularible4 小时前
HSM技术精讲(3.8):证书对象——数字世界的“身份证明“
安全·开源·嵌入式·汽车电子·hsm
WZF-Sang5 小时前
网络基础——2
服务器·网络·c++·学习·网络编程·php
德迅--文琪5 小时前
筑牢主机安全最后一公里,德迅卫士构建全维度智能防护屏障
安全
+wacyltd大模型备案算法备案5 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
心中有国也有家6 小时前
E-Brufen 技术选型全景:Flutter + 鸿蒙 + Hive CE
hive·hadoop·学习·flutter·华为·harmonyos
网络研究院7 小时前
Brave浏览器放大招引入容器功能,实现多账户安全隔离
网络·安全·容器·浏览器·数据·隐私