【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 会在循环中插入安全点,但这些安全点是基于循环迭代次数的计数器来确定的。这意味着,循环中的每个迭代不一定都会成为一个安全点,而是每隔一定次数的迭代才会插入一个安全点
相关推荐
用户962377954482 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954482 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star2 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954482 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
Derek_Smart3 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
大道至简Edward3 天前
深入 JVM 核心:一文读懂 Class 文件结构(附 Hex 实战解析)
jvm
cipher4 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行7 天前
网络安全总结
安全·web安全