java内存模型和内存结构_Java内存模型和优化

java内存模型和内存结构

总览

许多多线程代码开发人员都熟悉这样的想法,即不同的线程可以对持有的值有不同的看法,这不是唯一的原因,即如果线程不安全,它可能不会看到更改。 JIT本身可以发挥作用。

为什么不同的线程看到不同的值?

当您有多个线程时,它们将尝试例如通过尝试访问同一内存来最小化它们将交互的数量。 为此,他们有一个单独的

本地副本,例如在1级缓存中。 该缓存通常最终是一致的。 我已经看到了两个线程看到不同值的短时间,范围在1微秒到10毫秒之间。 最终,线程被上下文切换,缓存被清除或更新。 无法保证何时会发生这种情况,但是几乎总是不到一秒钟。

JIT如何发挥作用?

Java内存模型表示无法保证不是线程安全的字段将看到更新。 这允许JIT进行优化,将仅读取而不写入的值有效地内联到代码中。 这意味着即使更新了缓存,更改也可能不会反映在代码中。

一个例子

该代码将一直运行,直到将布尔值设置为false为止。

>static class MyTask implements Runnable {private final int loopTimes;private boolean running = true;boolean stopped = false;public MyTask(int loopTimes) {this.loopTimes = loopTimes;}@Overridepublic void run() {try {while (running) {longCalculation();}} finally {stopped = true;}}private void longCalculation() {for (int i = 1; i < loopTimes; i++)if (Math.log10(i) < 0)throw new AssertionError();}
}public static void main(String... args) throws InterruptedException {int loopTimes = Integer.parseInt(args[0]);MyTask task = new MyTask(loopTimes);Thread thread = new Thread(task);thread.setDaemon(true);thread.start();TimeUnit.MILLISECONDS.sleep(100);task.running = false;for (int i = 0; i < 200; i++) {TimeUnit.MILLISECONDS.sleep(500);System.out.println("stopped = " + task.stopped);if (task.stopped)break;}
}

该代码反复执行一些对内存没有影响的工作。 唯一的区别是需要多长时间。 通过花费更长的时间,它将确定在运行之前或之后将run()中的代码优化为false。

如果我用10或100和-XX:+ PrintCompilation来运行,我会看到

111    1     java.lang.String::hashCode (55 bytes)
112    2     java.lang.String::charAt (29 bytes)
135    3     vanilla.java.perfeg.threads.OptimisationMain$MyTask :longCalculation (35 bytes)
204    1 % ! vanilla.java.perfeg.threads.OptimisationMain$MyTask :run @ 0 (31 bytes)
stopped = false
stopped = false
stopped = false
stopped = false
... many deleted ...
stopped = false
stopped = false
stopped = false
stopped = false
stopped = false

如果我用1000运行它,您会看到run()尚未编译并且线程停止

112    1     java.lang.String::hashCode (55 bytes)
112    2     java.lang.String::charAt (29 bytes)
133    3     vanilla.java.perfeg.threads.OptimisationMain $MyTask::longCalculation (35 bytes)
135    1 %   vanilla.java.perfeg.threads.OptimisationMain $MyTask::longCalculation @ 2 (35 bytes)
stopped = true

一旦线程被编译,即使线程将进行多次上下文切换等,也永远不会看到更改。

如何解决这个问题

简单的解决方案是使该字段易变。 这将确保该字段的值是一致的,而不仅仅是最终一致,这可能是缓存可能为您执行的操作。

结论

虽然有很多类似的问题示例; 为什么我的线程没有停止? 答案更多与Java内存模型有关,Java内存模型允许JIT“内联”它执行硬件的字段,并在不同的缓存中具有多个数据副本。

参考: Vanilla Java博客上的JCG合作伙伴 Peter Lawrey提供的Java内存模型和优化 。

翻译自: https://www.javacodegeeks.com/2013/01/java-memory-model-and-optimisation-2.html

java内存模型和内存结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANTLR巨型教程

解析器是功能强大的工具&#xff0c;使用ANTLR&#xff0c;您可以编写可用于多种不同语言的各种解析器。 在本完整的教程中&#xff0c;我们将要&#xff1a; 解释基础 &#xff1a;解析器是什么&#xff0c;解析器可以用于什么 了解如何设置要从Javascript&#xff0c;Pyth…

Web进程被kill掉后线程还在运行怎么办?

目录 背景描述原因分析处理方案参考背景描述 系统有一个配置表&#xff0c;系统在启动后会启动一个线程&#xff0c;每隔5分钟将配置表里所有的数据更新到内存中。 系统是通过jenkins构建&#xff08;直接kill掉Web进程&#xff0c;然后传入新的包再启动&#xff09;的&#xf…

北京学python 价格怎么样_北京学习Python需要多少钱

Python本身语言具有一定的优势所在&#xff0c;简单易学&#xff0c;就业方向多&#xff0c;也就意外着从事Python的工程师相对于其他编程语言的工程师来说&#xff0c;就业机会更多&#xff0c;薪资待遇更高。1、web网站工程师&#xff1a;我们都知道web是我们一直不能忽视的存…

go Windows Service

相关库 https://godoc.org/golang.org/x/sys/windows/svchttps://github.com/kardianos/servicehttps://github.com/judwhite/go-svchttps://github.com/btcsuite/winsvc参考 云监控Go语言版本插件介绍 - 这个不知道用的什么库实现的Cannot start golang application exe as a …

华为南太无线解决方案部梁旭阳_华为无线充电新专利:激光无线充电,替代传统半接触式...

传统的无线充电技术是用感应线圈通过短距离&#xff0c;实际上是有接触式充电&#xff0c;但是相对于真正的无线充电&#xff0c;还是不够便利&#xff0c;最近&#xff0c;华为新无线充电技术曝光&#xff1a;激光无线充电。虽然无线充电已在近年得到了较大的普及&#xff0c;…

jquery的懒加载记录一下踩得坑

官网下载地址&#xff1a;http://plugins.jquery.com/lazyload/ 要引入两个文件&#xff0c;注意这些事html中包含着 <script src"https://code.jquery.com/jquery-1.11.3.min.js"></script><script src"js/jquery.lazyload.js"></sc…

rsync 同步优化_可以优化同步吗?

rsync 同步优化总览 有一个常见的误解&#xff0c;因为JIT很智能&#xff0c;并且可以消除对象的同步&#xff0c;而该对象仅存在于不影响性能的方法中。 比较StringBuffer和StringBuilder的测试 这两个类基本上做同样的事情&#xff0c;除了一个是同步的&#xff08;StringBu…

sudoers 用户权限配置_使用sudo让普通用户获取root用户的权限

sudo 是 Linux 系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具&#xff0c;如 halt&#xff0c;reboot&#xff0c;su 等等。这样不仅减少了 root 用户的登录 和管理时间&#xff0c;同样也提高了安全性。sudo不是对 shell 的一个…

Spring Boot –使用执行器端点在运行时配置日志级别

从Spring Boot 1.5开始&#xff0c;新的loggers器执行器端点允许在运行时查看和更改应用程序记录级别。 将spring-boot-actuator添加到您的项目 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator&…

Python学习教程:Python增强赋值及共享引用注意事项

Python学习教程&#xff1a;Python增强赋值及共享引用注意事项 概述 Python中的增强赋值是从C语言中借鉴出来的&#xff0c;所以这些格式的用法大多和C一致&#xff0c;本身就是对表达式的简写&#xff0c;即二元表达式和赋值语句的结合&#xff0c;比如a b 和a a b 就是一致…

python math.sinh_Python numpy.sinh()用法及代码示例

numpy.sinh(x [&#xff0c;out]) ufuncsin)&#xff1a;此数学函数可帮助用户计算所有x(作为数组元素)的双曲正弦值。等效于1/2 *(np.exp(x)-np.exp(-x))或-1j * np.sin(1j * x)。参数&#xff1a;array :[数组]元素以弧度为单位。2pi弧度 36o度返回&#xff1a;对于所有x即数…

中国大学MOOC-陈越、何钦铭-数据结构-2019春期末考试(题目+部分解答)

欢迎评论&#xff08;指正或是询问都可&#xff09;&#xff0c;谢谢大家 一、判断题 思路很正常的题目。 1-4反例&#xff1a;4个顶点只用3条边就可以做到全连通。所以边数可能等于顶点个数减一。错误。 二、选择题 2-8需要细心的做一下双旋操作&#xff0c; 2-12 C 设数字 {…

分析java 线程占用内存_Java线程:保留的内存分析

分析java 线程占用内存本文将为您提供一个教程&#xff0c;使您可以确定活动应用程序Java线程中保留了多少Java堆空间 。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究&#xff0c;以使您更好地理解分析过程。 我们还将尝试证明过多的垃圾回收或Java堆空间的内存占用…

图像傅里叶变换

1傅里叶变换物理意义 图像的频率是表征图像中灰度变化剧烈程度的指标&#xff0c;是灰度在平面空间上的梯度。如&#xff1a;大面积的沙漠在图像中是一片灰度变化缓慢的区域&#xff0c;对应的频率值很低&#xff1b;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧…

python获取涨停股票_今日股市光大证券

一、查询股票账户的总盈亏的方法如下&#xff1a;1、查询你的银行银证转账记录&#xff0c;用转进的资金总额减去转出的资金总额&#xff0c;再和你现在的证券账户市值比较&#xff0c;即可得出盈亏。2、联系你的开户券商&#xff0c;通过柜面进行轧差查询资金进出情况&#xf…

MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式

MVC web api 返回JSON的几种方式&#xff0c;Newtonsoft.Json序列化日期时间去T的几种方式 2015-01-18 00:11 https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1、在 WebApiConfig的 Register中加入以下代码 config.Formatters.JsonForm…

从微服务到分布式系统-Java开发人员生存指南

感觉像是对微服务的炒作正在慢慢地落到实处&#xff0c;并且我们的行业开始意识到&#xff0c;仅通过在现有组件之上公开一些HTTP接口就无法轻松创建根据微服务背后的体系结构范式的系统。 我们似乎确实同意必须进行服务优化的基础架构&#xff0c;文化和组织变革&#xff0c;最…

timespan怎么比较大小_钻石吊坠回收怎么选择大小?

钻石吊坠也是比较常见的钻饰&#xff0c;和钻戒不同的是&#xff0c;钻石吊坠并不是必须要买的珠宝&#xff0c;但作为点缀全身的装饰&#xff0c;钻石吊坠的大小问题也让大家很是关注&#xff0c;钻石吊坠回收怎么选择大小&#xff1f;一般我们会把钻石从10分算起(10分以下的钻…

图像边缘算子

&#xff08;1&#xff09;常见边缘检测算子&#xff1a;Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia &#xff08;2&#xff09; 其中一阶边缘算子&#xff1a;Roberts 、Sobel 、Prewitt、Kirsch。 其中二阶边缘算子&#xff1a;Laplacian、Log…

python使用telnet远程连接linux系统读取信息_Linux服务笔记之一:Telnet 远程登录

最近&#xff0c;在学习Linux服务器中的搭建&#xff0c;感觉上非常强大。下面&#xff0c;我写下在Linux下搭建Telnet服务来远程管理设备&#xff0d;&#xff0d;这也是一种古老的远程管理方 式这一。其中&#xff0c;Telnet服务也是基于C/S模式的。客户端用Telnet远程登录协…