JVM内存相关原则

jvm内存调优 jvm 阅读详情

JMM 规定所有变量都存储在主内存,每条线程有自己的工作内存,工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。不同线程间无法直接访问对方工作内存中的变量,线程通信必须经过主内存。

关于主内存与工作内存的交互,即变量如何从主内存拷贝到工作内存、从工作内存同步回主内存,JMM 定义了 8 种原子操作:

操作作用变量范围作用
lock主内存把变量标识为线程独占状态
unlock主内存释放处于锁定状态的变量
read主内存把变量值从主内存传到工作内存
load工作内存把 read 得到的值放入工作内存的变量副本
user工作内存把工作内存中的变量值传给执行引擎
assign工作内存把从执行引擎接收的值赋给工作内存变量
store工作内存把工作内存的变量值传到主内存
write主内存把 store 取到的变量值放入主内存变量中

as-if-serial

不管怎么重排序,单线程程序的执行结果不能改变,编译器和处理器必须遵循 as-if-serial 语义。

为了遵循 as-if-serial,编译器和处理器不会对存在数据依赖关系的操作重排序,因为这种重排序会改变执行结果。但是如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。

as-if-serial 把单线程程序保护起来,给程序员一种幻觉:单线程程序是按程序的顺序执行的。

happens-before

先行发生原则,JMM 定义的两项操作间的偏序关系,是判断数据是否存在竞争的重要手段。

JMM 将 happens-before 要求禁止的重排序按是否会改变程序执行结果分为两类。对于会改变结果的重排序 JMM 要求编译器和处理器必须禁止,对于不会改变结果的重排序,JMM 不做要求。

JMM 存在一些天然的 happens-before 关系,无需任何同步器协助就已经存在。如果两个操作的关系不在此列,并且无法从这些规则推导出来,它们就没有顺序性保障,虚拟机可以对它们随意进行重排序。

  1. 程序次序规则:一个线程内写在前面的操作先行发生于后面的。
  2. 管程锁定规则: unlock 操作先行发生于后面对同一个锁的 lock 操作。
  3. volatile 规则:对 volatile 变量的写操作先行发生于后面的读操作。
  4. 线程启动规则:线程的 start 方法先行发生于线程的每个动作。
  5. 线程终止规则:线程中所有操作先行发生于对线程的终止检测。
  6. 对象终结规则:对象的初始化先行发生于 finalize 方法。
  7. 传递性:如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那么操作 A 先行发生于操作 C 。

as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不变。

这两种语义的目的都是为了在不改变程序执行结果的前提下尽可能提高程序执行并行度。

指令重排序

为了提高性能,编译器和处理器通常会对指令进行重排序,重排序指从源代码到指令序列的重排序,分为三种:① 编译器优化的重排序,编译器在不改变单线程程序语义的前提下可以重排语句的执行顺序。② 指令级并行的重排序,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。③ 内存系统的重排序。

原子性

基本数据类型的访问都具备原子性,例外就是 long 和 double,虚拟机将没有被 volatile 修饰的 64 位数据操作划分为两次 32 位操作。

如果应用场景需要更大范围的原子性保证,JMM 还提供了 lock 和 unlock 操作满足需求,尽管 JVM 没有把这两种操作直接开放给用户使用,但是提供了更高层次的字节码指令 monitorenter 和 monitorexit,这两个字节码指令反映到 Java 代码中就是 synchronized。

原子性、可见性、有序性

可见性

可见性指当一个线程修改了共享变量时,其他线程能够立即得知修改。JMM 通过在变量修改后将值同步回主内存,在变量读取前从主内存刷新的方式实现可见性,无论普通变量还是 volatile 变量都是如此,区别是 volatile 保证新值能立即同步到主内存以及每次使用前立即从主内存刷新。

除了 volatile 外,synchronized 和 final 也可以保证可见性。同步块可见性由"对一个变量执行 unlock 前必须先把此变量同步回主内存,即先执行 store 和 write"这条规则获得。final 的可见性指:被 final 修饰的字段在构造方法中一旦初始化完成,并且构造方法没有把 this 引用传递出去,那么其他线程就能看到 final 字段的值。

有序性

有序性可以总结为:在本线程内观察所有操作是有序的,在一个线程内观察另一个线程,所有操作都是无序的。前半句指 as-if-serial 语义,后半句指指令重排序和工作内存与主内存延迟现象。

Java 提供 volatile 和 synchronized 保证有序性,volatile 本身就包含禁止指令重排序的语义,而 synchronized 保证一个变量在同一时刻只允许一条线程对其进行 lock 操作,确保持有同一个锁的两个同步块只能串行进入。

Spark 任务内存设置及分析调优 进入大数据领域后,零碎的接触很多东西,很多都是当时很清楚,过了一段时间就忘记了,所以整理一篇博客记录下: 先上一个看到比较好的博客,有时间在把自己的总结写下来:https://www.cnblogs.com/dreamfly2016/p/5720180.html 一.Spark 的内存划分,以spark 1.6 为例: 假设一个excutor 设置内存为10G: 1.安全空间(safe)为... 阅读详情

相关推荐

【JVM】JVM常用性能调优参数详细介绍

但是需要注意的是,JVM参数调优是一个复杂的过程,需要根据具体应用程序的情况进行调整,而且需要进行实验和测试,才能确定最佳的参数设置。一般是从满足程序的内存使用需求开始的,之后是时间延迟的要求,最后才是吞吐量的要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。JVM提供了大量的参数配置,可以通过配置这些参数对JVM进行调优、记录GC日志等等,本文只列出了我自己用到过和了解过的部分参数,根据功能划分。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。

No8g攻城狮的博客 1523

Java面向对象的八大原则(部分打破八大原则的场景)

面一家很老的电力公司问到的,那个四十多岁的戴金丝框眼镜的老头盯着一个面试文档一句一字的问概念,就问到这个问题,我真的是服气了,他自己都肯定记不住,但是却要求面试者完全背熟这些概念性的问题。 说句实在的,在实际项目开发中,没人会抠着这八大原则的字眼去写业务代码,我们都会大概知道有这么个约束,就自然而然地写,并且很多大公司的接口设计,也是有一定程度上打破这些原则的。 (1)单一职责原则 每一个类甚至每一个接口都只负责完成一个业务操作。比如我们一开始写demo时候,deleteById(int id )就是严格遵

whiteBearClimb的博客 760

2024东南大学533复试C++程序设计笔试真题精讲

【东南553复试C++】2024东南大学533复试C++程序设计笔试真题精讲

转遍世界 3414

java 8大happen-before原则超全面详解

再来重复下八大原则: 单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。 锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作。 volatile的happen-before原则:对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了)。...

GarfieldEr007的专栏 3665

Matplotlib字体警告终结者:为什么总提示DejaVu Sans?5种场景解决方案大全

本文深入解析Matplotlib中常见的DejaVu Sans字体警告问题,并提供5种典型场景的完整解决方案。从理解字体系统的三层架构和缓存机制,到解决中文显示、远程服务器部署、TeX渲染、缓存优化及生产环境配置等实际问题,帮助开发者彻底摆脱字体警告困扰,实现稳定可靠的数据可视化。

view3的博客 500

光学遥感显著目标检测初探笔记总结

一张图片里最吸引注意力的部分就是显著性物体,其实是模拟人的一个注意力机制。目标是希望通过计算机的方法让我们自动定位和模拟人的这种感知能力,从而去定位场景中的一个让人感兴趣的目标。

醋酸洋红的博客 2075

内存分配和回收策略

文章目录对象的分配1.对象优先在Eden分配2.大对象直接进入老年代长期存活的对象将进入老年代动态年龄判断空间分配担保 对象的分配 1.对象优先在Eden分配   大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次MinorGC。 2.大对象直接进入老年代   大对象就是指需要大量连续内存空间的Java对象,最典型的大对象便是那种很长的字符串,或者元素数量很庞大的数组。   大对象对虚拟机的内存分配来说就是一个不折不扣的坏消息,比遇到一个大对象更加坏的消息就是

qq_38438909的博客 204

无网络环境部署:手动获取并安装OneNote for Windows 10完整指南

本文提供了一份详尽的OneNote for Windows 10离线安装指南。针对无网络或内网隔离环境,详细介绍了如何从官方渠道获取正确的产品ID,利用第三方工具下载纯净的.appxbundle安装包,并解决系统兼容性与依赖框架问题。最后,通过PowerShell管理员命令完成安全部署,是IT管理员和高级用户在离线环境下部署UWP应用的实用参考。

loss4bartender的博客 495

JVM相关、一千万条数据的表, 如何分页查询

数据量过大的情况下, limit offset 分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后 一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT} . 当然, 这种情况下ID必须 是有序的, 这也是有序ID的好处之一。

m0_60594323的博客 652

NoUnityCN:绕过地域限制,从Unity官方CDN直链下载全版本编辑器

在软件开发和游戏制作领域,内容分发网络(CDN)是保障全球用户高速、稳定获取大型文件的核心基础设施。其原理是通过将资源缓存至遍布各地的边缘节点,使用户能从地理距离最近的服务器获取数据,从而显著提升下载速度并降低源站压力。这一技术对于需要频繁下载大型开发工具(如游戏引擎)的团队而言,价值在于能确保开发环境部署的一致性与效率,是构建自动化CI/CD流水线和团队协作的基础。然而,当开发者因网络策略或地域限制无法直接访问官方CDN时,获取安装文件便成为阻碍工作流的痛点。NoUnityCN项目正是针对此场景的工程实践

weixin_33473110的博客 311

保姆级教程:用QSTEM和DrProbe搞定你的第一张STEM模拟图(附Fe3O4实例文件)

本文提供了一份详细的STEM模拟图像生成教程,涵盖从晶体结构获取到最终图像模拟的全过程。通过QSTEM和DrProbe软件的操作指南,帮助材料科学研究者快速掌握STEM模拟技术,特别适合初学者。教程包含Fe3O4实例文件,详细解析参数设置、计算优化和结果分析等关键步骤。

weixin_33730836的博客 523

Jvm 元空间大小分配原则

JVM元空间(Metaspace)大小分配不是按物理内存固定比例,而是动态管理。默认无上限,受限于可用物理内存和MaxMetaspaceSize参数设置。JVM根据类加载需求动态扩展元空间,直到达到设定上限或系统内存耗尽。建议生产环境中设置MetaspaceSize和MaxMetaspaceSize参数,如128M初始值和512M最大值,防止内存过度占用。同时需监控元空间使用,避免类加载过多导致OOM。分配原则是按需动态扩展,最终受参数和物理内存双重限制。

龙大的博客 1337

基于深度学习的X光安检危险品检测系统(YOLOv8 + UI界面 + 数据集)

随着全球安全形势的变化,机场、车站、地铁等场所的安检工作日益重要。X光安检系统已经成为现代公共安全领域中不可或缺的部分,能够有效地检测物品的内部结构,识别潜在的危险品。然而,传统的X光图像分析方法仍然依赖人工操作,检测效率较低,并且易受到人为因素的影响。近年来,深度学习技术的应用在图像分析领域取得了显著的突破,特别是在目标检测任务中,YOLO(You Only Look Once)模型因其高效性和精度,成为了许多目标检测任务的首选模型。

YOLO 1060

JVM内存分配机制(策略)

<细节向>JVM内存分配机制(策略) 首先JVM内存分配机制有着三大原则和一个担保机制: 三大原则: 1.优先分配到eden区; 2.大对象,直接分配到老年代; 3.长期存活的对象分配到老年代; 担保机制: 空间分配担保 Firstly,首先验证三大原则之:优先分配到eden区 创建一个4m的字节数组,如下: 打印gc日志如下: Heap PSYoungGen total ...

weixin_38107316的博客 436

银行监管报送系统系列介绍(二十一):银行监管报送系统总览

为保护法院案件当事人、利害关系人的合法权益,全面落实《最高人民法院、中国银行业监督管理委员会关于人民法院与银行业金融机构开展网络执行查控和联合信用惩戒工作的意见》(法【2014】266号),最高人民法院和银监会联合下发了《人民法院、银行业金融机构网络执行查控工作规范》(法【2015】321号),要求银行金融机构配合最高人民法院开展 “总对总”网络执行查控工作,并建立相应的业务系统,实现与法院的网络对接,协助法院完成对被执行人银行账户存款及其他金融资金的网络查询、冻结与扣划工作。

银行信息系统应用架构详解 2863

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jvm相关

1.什么情况下会发生栈内存溢出。 栈的定义:栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表又包含基本数据类型,对象引用类型。 为什么会溢出:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常,方法递归调用产生这种结果。 如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是无法申请到足够的内存去完成扩展,或者在新建立线程的时...

xgdtale的专栏 156

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

调整jvm参数_JVM性能调优详解

前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备。这篇文章带领大家学习JVM性能调优的知识。性能调优性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标、发现性能瓶颈、性能调优、通过监控及数据统计...

weixin_35990136的博客 622

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

测试工程师都能看懂的Jvm知识 下

你好 我是懂java的测试前言前两篇文章介绍了一些jvm的理论知识,反响还不错,本篇文章分享一些jvm比较高阶的知识。还是老规矩,本文将以问答形式,由易到难,循序渐进讲述jvm相关的知识。不拽那些官方晦涩难懂的词语,只想用白话通俗的语言,力争让大家都能看懂jvm。1、GC日志怎么看?上篇文章最后显示的是GC日志Java HotSpot(TM) 64-Bit Server VM (25.211-b12) for windows-amd64 JRE (1. 8.0_211-b12), built on Apr

weixin_37821347的博客 618

JVM八股文

3.native:凡是带了native关键字的,说明java的作用范围达不到了,回去调用底层语言的库,会进入本地方法栈,调用本地方法本地接口JNI,JNI作用:扩展java的使用,融合不同的语音为java使用,最初c,c++,它在内存区域专门开辟了一块标记区域:native method stack,登记native方法,在最终执行的时候,加载本地方法库中的方法通过JNI。栈:栈内存,主管程序的运行,生命周期和线程同步,线程结束,栈内存也就释放,对于栈来说,不存在垃圾回收问题,一旦线程结束,栈就over。

m0_66698515的博客 584

51.整理JVM

JVM调优的原则? 不要为了调优而调优,首先确定的应该是项目的架构与代码已经没有优化的空间了,再考虑进行JVM的调优工作,不能指望通过JVM调优来使得性能有一个质的飞越 从三个属性中(吞吐量,延迟,内存)中选择两个进行JVM调优,称之为调优3选2,在处理吞吐量和延迟问题时,GC能使用的内存越大,应用运行也就越流畅,这也叫GC内存最大化原则 什么情况下需要进行调优? Full GC数量频繁,GC停顿时间超长(超过1s) 应用出现OOM异常或者吞吐量下降,响应性能不高, 应用CPU占用过高,内存占用过

奈斯查尔斯吴的博客 524

jmm内存模型_JMM内存模型原理与实践面试必备(三)

1 什么是JVM内存模型Java memory model Java(JMM)内存模型,通过Java内存模型来屏蔽各种硬件和操作系统访问内存的差异。Java程序在不同平台上达到访问内存一致的效果,避免在并发的时候由于硬件不同导致并发出现问题。所以需要定义一个统一的Java内存模型来解决这个问题。2 为什么需要JVM内存模型JMM解决了不同硬件和操作系统之间的访问差别,通过自定义程序中变量...

weixin_39531635的博客 60

JVM内存模式

1. 什么是JVM内存结构? jvm将虚拟机分为5大区域,程序计数器、虚拟机栈、本地方法栈、java堆、方法区; 程序计数器:线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址; 虚拟机栈:线程私有的,每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数、动态链接和方法返回等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError; 本地方法栈:线程私有的,保存的是native方法的信息,当一个jvm创

佳佳乐的博客 453

jvm面试题

应用程序可以自定义类加载器,父类加载器为AppClassLoader。

摸鱼喇手 122

Java并发01 - Java内存模型JMM

Java并发01 - Java内存模型JMM

qq_43350524的博客 1051

【有料】【JVM进阶之路】十:JVM调优总结

6、为了验证自己的猜想,于是准备登录后台去测试下,结果在测试的过程中发现到处订单的按钮前端居然没有做点击后按钮置灰交互事件,结果按钮可以一直点,因为导出订单数据本来就非常慢,使用的人员可能发现点击后很久后页面都没反应,结果就一直点,结果就大量的请求进入到后台,堆内存产生了大量的订单对象和EXCEL对象,而且方法执行非常慢,导致这一段时间内这些对象都无法被回收,所以最终导致内存溢出。注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。

daobuxinzi的博客 320

备战面试日记(2.6) - (JVM.JVM调优)

本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试。 记录日期:2022.1.3 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习。 文章目录JVM - JVM调优JVM参数JVM参数设置方法JVM调优工具JPS、JMAP、JSTACKjconsolejvisualvm使用方式JVM调优方案调优原则调优目的调优方案调优步骤1.监控GC的状态2.分析结果,判断是否需要优化3.调整GC类型和内存分配4.不断的分析和调整5.全面应用参数调优实战如果

weixin_44414492的博客 897
上一篇: DDD领域驱动设计模型
下一篇: Mybatis中使用的10种设计模式
huapro.vip
博客等级 码龄15年 36粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值