没有几十年功力,写不出这一行“看似无用”的代码!!
往期热门文章:
1、为什么 Spring和IDEA 都不推荐使用 @Autowired 注解 2、从阿里跳槽来的工程师,写个Controller都这么优雅! 3、try catch真的会影响性能?居然被骗了好几年... 4、学会这10种定时任务,我有点飘了 5、大家注意了,JavaBean转Map有一个巨坑千万小心!
Thread.sleep(0);
org.apache.rocketmq.store.logfile.DefaultMappedFile#warmMappedFile
提出这个修改方案的理论立足点是 Java 的安全点相关的知识,也就是 safepoint。 官方最后没有采纳这个修改方案。 官方采没采纳不重要,重要的是我高低得给你“剥个茧”。
探索
https://github.com/apache/rocketmq/issues/4902
https://stackoverflow.com/questions/53284031/why-thread-sleep0-can-prevent-gc-in-rocketmq
有了安全点的设定,也就决定了用户程序执行时并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达安全点后才能够暂停。
是 HotSpot 虚拟机为了避免安全点过多带来过重的负担,对循环还有一项优化措施,认为循环次数较少的话,执行时间应该也不会太长,所以使用 int 类型或范围更小的数据类型作为索引值的循环默认是不会被放置安全点的。这种循环被称为可数循环(Counted Loop),相对应地,使用 long 或者范围更大的数据类型作为索引值的循环就被称为不可数循环(Uncounted Loop),将会被放置安全点。
https://juejin.cn/post/6844903878765314061 HBase 实战:记一次 Safepoint 导致长时间 STW 的踩坑之旅
https://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/tip/src/share/vm/runtime/safepoint.cpp
When returning from the native code, a Java thread must check the safepoint _state to see if we must block.
https://www.zhihu.com/question/29268019/answer/43762165
https://hllvm-group.iteye.com/group/topic/38232?page=2
实践
public class MainTest {
public static AtomicInteger num = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Runnable runnable=()->{
for (int i = 0; i < 1000000000; i++) {
num.getAndAdd(1);
}
System.out.println(Thread.currentThread().getName()+"执行结束!");
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
Thread.sleep(1000);
System.out.println("num = " + num);
}
}
1.启动了两个长的、不间断的循环(内部没有安全点检查)。 2.主线程进入睡眠状态 1 秒钟。 3.在 1000 ms 之后,JVM 尝试在 Safepoint 停止,以便 Java 线程进行定期清理,但是直到可数循环完成后才能执行此操作。 4.主线程的 Thread.sleep 方法从 native 返回,发现安全点操作正在进行中,于是把自己挂起,直到操作结束。
额外提一句
byteBuffer.put(i, (byte) 0);
https://tianchi.aliyun.com/competition/entrance/531922/information
https://tianchi.aliyun.com/forum/postDetail?spm=5176.12586969.0.0.13714154spKjib&postId=300892
https://tianchi.aliyun.com/forum/postDetail?spm=5176.21852664.0.0.4c353a5a06PzVZ&postId=313716
往期热门文章:
1、国产开发工具的天花板,用来撸项目真香! 2、这个 MySQL bug 99% 的人会踩坑! 3、公司产品太多了,怎么实现一次登录产品互通? 4、Redis 官方可视化工具,高颜值,功能太强大! 5、用了BigDecimal就不会资损?了解下BigDecimal这五个坑 6、一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷! 7、千万不要把 Request 传递到异步线程里面!有坑! 8、不卷了!入职字节一周就果断跑了。 9、SpringBoot+ShardingSphereJDBC实现读写分离! 10、不好意思, Maven 该换了!
评论