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

JVM基础:什么是STW?

今天笔试题,出了个STW,咱是见也没见过,漏了怯了

无语,仔细回忆了下,知道Stop-The-World这个词,不知道SWT,无语

文章目录

  • STW:Stop-The-World
    • STW概念
    • 进入SWT时机
    • STW停顿的原因
    • STW示例代码

STW:Stop-The-World

STW概念

STW(Stop-The-World): 是在垃圾回收算法执行过程当中,将JVM内存冻结、应用程序停顿的⼀种状态。

一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。

STW是不可避免的,垃圾回收算法执行一定会出现STW,我们要做的只是减少停顿的时间,所以 GC各种算法优化的重点,就是减少STW(暂停),同时这也是JVM调优的重点。

进入SWT时机

当可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿,进入STW状态

STW停顿的原因

首先,分析工作必须在一个能确保一致性的快照中进行,如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证,被STW中断的应用程序线程会在完成GC之后恢复,频繁的中断会让用户感觉卡顿

一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上

所以我们要减少STW的发生,也就相当于要想办法降低GC垃圾回收的频率,STW状态和采用哪款GC收集器无关,所有的GC收集器都有这个状态,因为要保证一致性。

但是好的GC收集器可以减少停顿的时间,减少STW(暂停)和降低GC垃圾回收的频率是调优的重点,如果系统卡顿很明显,大概率就是频繁执行GC垃圾回收,频繁进入STW状态产生停顿的缘故

STW示例代码

代码如下:

package com.yyl.threadTest;

import java.util.ArrayList;
import java.util.List;

public class StopTheWorldDemo {
    public static class WorkThread extends Thread {
        List<byte[]> list = new ArrayList<byte[]>();

        public void run() {
            try {
                while (true) {
                    for(int i = 0;i < 1000;i++){
                        byte[] buffer = new byte[1024];
                        list.add(buffer);
                    }

                    if(list.size() > 10000){
                        list.clear();
                        System.gc();//会触发full gc,进而会出现STW事件
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static class PrintThread extends Thread {
        public final long startTime = System.currentTimeMillis();

        public void run() {
            try {
                while (true) {
                    // 每秒打印时间信息
                    long t = System.currentTimeMillis() - startTime;

                    System.out.println(t / 1000 + "." + t % 1000);
                    Thread.sleep(1000);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        WorkThread w = new WorkThread();
        PrintThread p = new PrintThread();
        w.start();
        p.start();
    }
}

P线程执行每隔一秒打印一次,当没有w线程时的输出秒数间隔规律为1秒。

但当同时运行w线程时,W线程当中的GC触发了STW,进而干扰了P线程有规律性打印。打印变得杂乱无章

image-20220924231804706

相关文章:

  • Teams Bot App 初探
  • 3d卷积神经网络应用,3d可视动态神经检测
  • Hive on Tez 的安装配置
  • 05 关于局部变量名字的存储
  • java毕业设计教程SSM框架实现的车位租赁管理系统|停车场计费系统[包运行成功]
  • 微雪树莓派PICO笔记——7. SPI(串行外设接口)
  • 真正理解Java中的异步
  • 《Unity3D脚本编程与游戏开发》学习Day one
  • JavaScript:JavaScript编程语言学习之前端框架(VUE)架构(MVVM)的简介、案例应用之详细攻略
  • [Python]闭包
  • 《C++程序设计原理与实践》笔记 第5章 错误
  • 静息态fMRI方法在脑动力学表征上的比较
  • LabVIEW自动整理程序框图
  • 拨测API接口+监控方案
  • 第一性原理详解
  • ES6指北【2】—— 箭头函数
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • docker-consul
  • es6--symbol
  • mysql 5.6 原生Online DDL解析
  • Netty 4.1 源代码学习:线程模型
  • Selenium实战教程系列(二)---元素定位
  • 测试如何在敏捷团队中工作?
  • 关于Flux,Vuex,Redux的思考
  • 蓝海存储开关机注意事项总结
  • 你真的知道 == 和 equals 的区别吗?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 06-01 点餐小程序前台界面搭建
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • #pragma 指令
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (离散数学)逻辑连接词
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十六)串口UART
  • (转)Android学习笔记 --- android任务栈和启动模式
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bashrc在哪里,alias妙用
  • .cfg\.dat\.mak(持续补充)
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET MVC第三章、三种传值方式
  • .Net mvc总结
  • .Net 垃圾回收机制原理(二)
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .skip() 和 .only() 的使用
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [ES-5.6.12] x-pack ssl