一道面试题引发的对Java内存模型的一点疑问

问题描述如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作。但在我的多次运行中,偶尔会出现 while 循环一直不结束的场合。像我截图一样,程序一直不终止,JDK7、JDK8 均已试验,均能偶然触发。

回复

[西湖の风]:变量前加个 volatile。

[csyangchsh]:volatile 使用读写屏障强制刷新缓存,如果不加就由 CPU 决定何时刷新。

[sofkyle]:由 CPU 决定何时刷新,那么可以认为,终会有一个时机会去刷新,但是while卡在那一直不刷新。

[你假笨]:和 jit 也是有一定关系的,-Xint 设定解释执行,也可以只关闭 OSR 看看,-XX:-UseOnStackReplacement。

JVM STW 里的 no vm operation 是怎么发生的

问题描述

我们线上应用提供的服务接口突然超时(dubbo服务接口调用耗时最大限制1s),发现gc.log在对应的时间进入了STW,耗时1.526s查看对应的vm.log发现在相对饮的时间有一个no vm operation提示,请教下:no vm operation,这个类型vm具体在做什么操作啊?如何优化?

回复

[你假笨]:safepoint并不是一定要发生了某个VM_OP才会进入的,VMThread本身的执行,就是不断循环,看是否有必要进入safepoint,或者是否要执行一些VM_OP,可以看下这块代码。

while (!should_terminate() && _cur_vm_operation == NULL) {

// wait with a timeout to guarantee safepoints at regular intervals bool timedout =

VMOperationQueue_lock->wait(Mutex::_no_safepoint_check_flag,

GuaranteedSafepointInterval);

// Support for self destruction if ((SelfDestructTimer != 0) && !is_error_reported() &&

(os::elapsedTime() > SelfDestructTimer * 60)) {

tty->print_cr("VM self-destructed");

exit(-1);

}

if (timedout && (SafepointALot ||

SafepointSynchronize::is_cleanup_needed())) {

MutexUnlockerEx mul(VMOperationQueue_lock,

Mutex::_no_safepoint_check_flag);

// Force a safepoint since we have not had one for at least // 'GuaranteedSafepointInterval' milliseconds. This will run all // the clean-up processing that needs to be done regularly at a // safepoint SafepointSynchronize::begin();

#ifdef ASSERT if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot();

#endif SafepointSynchronize::end();

}

_cur_vm_operation = _vm_queue->remove_next();

// If we are at a safepoint we will evaluate all the operations that // follow that also require a safepoint if (_cur_vm_operation != NULL &&

_cur_vm_operation->evaluate_at_safepoint()) {

safepoint_ops = _vm_queue->drain_at_safepoint_priority();

}

}

几个关键的点,GuaranteedSafepointInterval,timedout,SafepointSynchronize::is_cleanup_needed()

如果上面条件满足,就会发生 no vm operation 的 safepoint 操作。

通过GarbageCollectorMXBean获取到的fgc次数耗时与jstat获取到的不一致

问题描述

-XX:+UseCompressedOops -Xms5g -Xmx5g -XX:PermSize=256M -XX:MaxPermSize=1024m -XX:NewSize=3g -XX:MaxNewSize=3g -XX:+UseCMSInitiatingOccupancyOnly -XX:+PerfDataSaveToFile -XX:SurvivorRatio=10 -Xloggc:/data/dataLogs/gc/gc.log -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+HeapDumpOnOutOfMemoryError如题,这是我的 jvm 参数,jstat采集到的ygc次数与mxbean是一致的,fgc的数量大概是mxbean统计到的两倍,但是不到两倍。

对于耗时,jstat采集到的无论是ygc还是fgc均小于mxbean统计到的数据。

回复

[Rookie_267692]:这是因为CMS收集器在MXBean是在每次发生FGC时只会在Sweeping统计一次,而jstat会在InitialMark阶段统计一次,FinalMark阶段统计一次,这样发生一次CMS gc时就会统计两次,所以次数不一致。

gc时间在MXBen中统计的是整个gc从开始到结束时间,jstat统计的是gc在每个阶段实际耗费的时间。

欢迎到 PerfMa 社区 参与上述问题讨论~

推荐阅读:JVM源码分析之警惕存在内存泄漏风险的FinalReference(增强版) | PerfMa应用性能技术社区​club.perfma.com

java yang模型_一道面试题引发的对Java内存模型的一点疑问相关推荐

  1. h5 bootstrap 小程序模板_一道面试题小程序与H5的区别

    抛砖 此文是一道面试题,又不仅仅是一道面试题 面试题,在各个技术社区里都是一个永不落伍的话题,好像大多数人临面试前都会狂刷面试题,恨不得把所有面试题都看一遍,要说有用没,当然有用,因为大部分面试题确实 ...

  2. java的jmm模型_【深入理解JVM】:Java内存模型JMM

    多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...

  3. java hashmap用法_备战金九银十:Java核心技术面试题100+,助你搞定面试官

    一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...

  4. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  5. java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)

    点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...

  6. java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章

    写在前面 本节常见面试题: 问题答案在文中都有提到 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断 ...

  7. 生命周期模型_建立从思想到价值的生命周期模型

    生命周期模型 数据科学家来自火星,软件工程师来自金星(第4部分)(DATA SCIENTISTS ARE FROM MARS AND SOFTWARE ENGINEERS ARE FROM VENUS ...

  8. java 核型技术_你必须掌握的 21 个 Java 核心技术!(转自Java技术栈)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE ...

  9. java runtime类 heap_Java 进阶(一) JVM运行时内存模型

    1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...

最新文章

  1. Linux控制Bash输出的格式与颜色
  2. 原生js实现Ajax,JSONP
  3. 30 个 Pandas技巧,加速你的数据分析处理速度!
  4. 关系数据库基础:函数依赖知识笔记
  5. python网页结构分析_Python爬虫基础之网页组成解析
  6. Python操作redis(普通操作,连接池,封装)
  7. 版本对应关系python TensorFlow+Keras
  8. W3School 教程整理
  9. python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下
  10. 之间有什么区别。 (点)和$(美元符号)?
  11. HDU 1022 Train Problem I stack 基础题
  12. Slam(即时定位与地图构建)
  13. android应用调试之如何保存logcat日志到本地
  14. 网吧母盘的制作(2007详细)
  15. 利用C语言读取WAV文件
  16. linux服务器如何查看mac地址,linux如何查看mac地址_查看mac地址 linux_linux查看mac地址...
  17. Oracle 考试题 答案
  18. 《大话物联网(第2版)》赠书活动名单公告
  19. < Linux > 守护进程
  20. C++课后作业 3. 教材习题4_8:定义Dog类,包含age和weight信息

热门文章

  1. 【面试常问】Java中final和finally以及finalize区别?
  2. redis的字典(Hash)
  3. 【Jmeter 简单使用】
  4. STC8H开发(十五): GPIO驱动Ci24R1无线模块
  5. SQLyog Ultimate 13.2 Crack
  6. 【软件安全:软件安全技术课后习题及答案】
  7. C++鼠标锁定或乱跳(坑人必备)
  8. onblur事件不支持冒泡的解决办法
  9. AutoCAD Electrical(ACE)的基本操作——画布与新建圆、直线
  10. hey-cli初使用