java yang模型_一道面试题引发的对Java内存模型的一点疑问
一道面试题引发的对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内存模型的一点疑问相关推荐
- h5 bootstrap 小程序模板_一道面试题小程序与H5的区别
抛砖 此文是一道面试题,又不仅仅是一道面试题 面试题,在各个技术社区里都是一个永不落伍的话题,好像大多数人临面试前都会狂刷面试题,恨不得把所有面试题都看一遍,要说有用没,当然有用,因为大部分面试题确实 ...
- java的jmm模型_【深入理解JVM】:Java内存模型JMM
多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...
- java hashmap用法_备战金九银十:Java核心技术面试题100+,助你搞定面试官
一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...
- java 创建线程_【80期】说出Java创建线程的三种方式及对比
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...
- java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)
点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...
- java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章
写在前面 本节常见面试题: 问题答案在文中都有提到 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断 ...
- 生命周期模型_建立从思想到价值的生命周期模型
生命周期模型 数据科学家来自火星,软件工程师来自金星(第4部分)(DATA SCIENTISTS ARE FROM MARS AND SOFTWARE ENGINEERS ARE FROM VENUS ...
- java 核型技术_你必须掌握的 21 个 Java 核心技术!(转自Java技术栈)
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE ...
- java runtime类 heap_Java 进阶(一) JVM运行时内存模型
1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...
最新文章
- Linux控制Bash输出的格式与颜色
- 原生js实现Ajax,JSONP
- 30 个 Pandas技巧,加速你的数据分析处理速度!
- 关系数据库基础:函数依赖知识笔记
- python网页结构分析_Python爬虫基础之网页组成解析
- Python操作redis(普通操作,连接池,封装)
- 版本对应关系python TensorFlow+Keras
- W3School 教程整理
- python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下
- 之间有什么区别。 (点)和$(美元符号)?
- HDU 1022 Train Problem I stack 基础题
- Slam(即时定位与地图构建)
- android应用调试之如何保存logcat日志到本地
- 网吧母盘的制作(2007详细)
- 利用C语言读取WAV文件
- linux服务器如何查看mac地址,linux如何查看mac地址_查看mac地址 linux_linux查看mac地址...
- Oracle 考试题 答案
- 《大话物联网(第2版)》赠书活动名单公告
- < Linux > 守护进程
- C++课后作业 3. 教材习题4_8:定义Dog类,包含age和weight信息