【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 会在循环中插入安全点,但这些安全点是基于循环迭代次数的计数器来确定的。这意味着,循环中的每个迭代不一定都会成为一个安全点,而是每隔一定次数的迭代才会插入一个安全点
相关推荐
naruto_lnq2 分钟前
用Python批量处理Excel和CSV文件
jvm·数据库·python
wdfk_prog18 分钟前
[Linux]学习笔记系列 -- [drivers][clk]clk
linux·笔记·学习
2301_8223650325 分钟前
数据分析与科学计算
jvm·数据库·python
岳轩子27 分钟前
JVM Java 类加载机制与 ClassLoader 核心知识全总结 第二节
java·开发语言·jvm
黄连升30 分钟前
Python学习第二天,系统学习基础
python·学习
tudficdew36 分钟前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
爱学习的阿磊44 分钟前
使用XGBoost赢得Kaggle比赛
jvm·数据库·python
科技林总1 小时前
【系统分析师】5.7 数据挖掘技术
学习
m0_748229991 小时前
帝国CMS后台搭建全攻略
java·c语言·开发语言·学习
上海云盾安全满满2 小时前
移动应用安全防调试功能阻止恶意分析
网络·安全