java 性能调优之内存模型深入详解

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习 开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧! 阅读详情

1. 概述

      多任务和高并发是衡量一台计算机处理器的能力重要指标之一,虽然判断服务器的好坏主要跟CPU,内存,硬盘有关,比如说CUP核心数和线程,内存主要看内存的大小,硬盘主要看转速以及容量,但是服务器性能的高低与好坏,综合来说就是在使用的时候,每秒事务处理数这个指标最能说明问题,也就是说每秒内服务器平均能响应的请求数,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系,因为他们的关系直接反映整个系统的吞吐量,大家知道服务器是由软件和硬件组成的,那么首先我们来讨论一下硬件,先简单介绍一下硬件的效率与一致性。

2.硬件的效率与一致性

     其实计算器的存储设备与处理器的运算能力不在同一层面上,也就说处理器的运算能力会受内存的读写功能影响,所以为了不影响处理器的运算能力,人们不得不在他们中间加一个缓存区,也就是高速缓存,将运算需要用到的数据提前复制到缓存中,节省运算处于等待的时间,运算完之后,再将缓存中的数据同步到内存中。

虽然这样可以解决内存和CPU的速度矛盾,同时引发了一个新的问题,也就是缓存一致性,因为现在的电脑有些是双核,四核,甚至是八核处理器,但是他们共享一个主内存,所有他们必须要有个协议,防止混乱或者是重复运算,保障数据的一致性,当然这些协议有MSI、MESI、MOSI及Dragon Protocol等。

Java虚拟机内存模型中定义的内存访问操作与硬件的缓存访问操作是具有可比性的,后续将介绍Java内存模型。


  除此之外,为了使得处理器内部的运算单元能竟可能被充分利用,处理器可能会对输入代码进行乱起执行(Out-Of-Order Execution)优化,处理器会在计算之后将对乱序执行的代码进行结果重组,保证结果准确性。与处理器的乱序执行优化类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction Recorder)优化。

3.Java内存模型

  定义Java内存模型并不是一件容易的事情,这个模型必须定义得足够严谨,才能让Java的并发操作不会产生歧义;但是,也必须得足够宽松,使得虚拟机的实现能有足够的自由空间去利用硬件的各种特性(寄存器、高速缓存等)来获取更好的执行速度。经过长时间的验证和修补,在JDK1.5发布后,Java内存模型就已经成熟和完善起来了。

3.1 主内存与工作内存

  Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。

  Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程、主内存和工作内存的交互关系如下图所示,和上图很类似。


3.2 内存间交互操作

  关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节,Java内存模型定义了以下八种操作来完成:

  • lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
  • unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  • read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
  • use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
  • assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
  • store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
  • write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

  如果要把一个变量从主内存中复制到工作内存,就需要按顺寻地执行read和load操作,如果把变量从工作内存中同步回主内存中,就要按顺序地执行store和write操作。Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行。也就是read和load之间,store和write之间是可以插入其他指令的,如对主内存中的变量a、b进行访问时,可能的顺序是read a,read b,load b, load a。Java内存模型还规定了在执行上述八种基本操作时,必须满足如下规则:

  • 不允许read和load、store和write操作之一单独出现
  • 不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了之后必须同步到主内存中。
  • 不允许一个线程无原因地(没有发生过任何assign操作)把数据从工作内存同步回主内存中。
  • 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。即就是对一个变量实施use和store操作之前,必须先执行过了assign和load操作。
  • 一个变量在同一时刻只允许一条线程对其进行lock操作,lock和unlock必须成对出现
  • 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值
  • 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去unlock一个被其他线程锁定的变量。
  • 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)。

 3.3 重排序

  在执行程序时为了提高性能,编译器和处理器经常会对指令进行重排序。重排序分成三种类型:

  1. 编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序。
  2. 指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
  3. 内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

从Java源代码到最终实际执行的指令序列,会经过下面三种重排序:

为了保证内存的可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。Java内存模型把内存屏障分为LoadLoad、LoadStore、StoreLoad和StoreStore四种:


3.4 同步机制

介绍volatile、synchronized和final

3.5 原子性、可见性与有序性

介绍三个特性


【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码) 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。 阅读详情

相关推荐

DSP配置I2C通讯(非IO口软件模拟时序)

dsp即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的dsp供应商是ti公司,其tms32系列产品占据了dsp市场近一半的份额,本文以TMS320F28377D为例,使用ti公司dsp开发工具ccs10.1配置i2c模块。 写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。 下面先介绍一下配置步骤 1.E

weixin_44387442的博客 5545

JAVA内存模型及jvm调优详解

Java采用的事Hotspot 虚拟机,按需加载 ,懒加载的方式。

weixin_40130409的博客 1201

专项1.CCS代码补全与快捷键优化全攻略

本文全面解析CCS开发环境的代码补全功能与快捷键优化技巧,包括内容辅助触发机制、快捷键自定义配置、编码效率提升方法等实用内容。通过详细步骤指导开发者优化CCS配置,实现高效的代码自动补全和个性化快捷键设置,显著提升嵌入式开发效率。

kotlin6android的博客 223

java超详细的jvm调优

java超详细的jvm调优

记录开发日常笔记 4891

PCB工程师必看:别再搞错1078玻纤布的Dk了,手把手教你算等效介电常数

本文为PCB工程师提供了1078玻纤布等效介电常数(Dk)的详细计算指南,帮助解决高速设计中的信号完整性问题。通过解析玻纤布结构、混合介质理论和实战计算方法,指导工程师准确设置EDA工具参数,避免常见的Dk计算误区,提升设计精度和仿真准确性。

weixin_42546392的博客 399

nvprof:CUDA编程性能分析工具

NVIDIA提供了具有高性能计算的GPU产品,如何检验硬件的实际性能,写出高效的CUDA代码让算力加速卡物尽其用,那可以通过其配套提供的“护城河”软件工具链来检验和帮助发挥GPU的性能:nvprof。如下,对于将8192个A,B向量进行向量加法运算,即C[i] = A[i] + B[i],当软件设置不同的blocknum, threadnum时候,CUDA执行kernel的时间是不同的。比如如下命令,可以看到程序tmp1的总体性能,下面一行是打印gpu的执行时间情况。

Briwisdom的博客 3384

java 内存调优_JVM内存模型以及性能调优

JVM 内存模型JVM.png程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执...

weixin_27224119的博客 292

HBuilderX结合Android Studio实现Uniapp安卓Apk高效离线打包指南

本文提供了一份详细的Uniapp安卓Apk离线打包实战指南。通过整合HBuilderX与Android Studio,手把手教你搭建本地编译环境、配置原生工程、执行核心打包流程,并分享快速更新资源和排查常见问题的技巧,助你彻底摆脱云端打包的排队依赖,实现高效、可控的应用构建。

weixin_28835551的博客 558

JVM内存模型 及 调优方案

(1)类装载子系统                 装载 连接 初始化 (2)方法区。被所有线程共享。垃圾收集也会清理方法区中的无用类型对象。                 a. 类型信息。类加载器加载类时,从类文件中提取出来。                                 类的完整有效名                              

zhao9tian的专栏 936

Android 9.0 系统framework关于忘记开机锁屏密码进不去系统桌面清除锁屏密码问题的解决

在9.0的系统rom定制化开发中,在一些产品中带锁屏密码的功能中,系统默认是滑动解锁,但是客户会设置锁屏密码,在某些时候会 忘掉锁屏密码,导致需要进入恢复出厂设置然后才能进入系统桌面,这样就导致系统的保存的资料都丢失了,所以需要要求提供接口 在下拉状态栏中或者系统服务中在忘记锁屏密码后不恢复出厂设置的情况下,可以清除锁屏密码,接下来就来实现功能

安卓兼职framework和app工程师的博客 615

块存储:AIO的直接写流程注释

提交io流程中aio_write之前函数的注释,可参考“块存储:AIO的直接读流程注释”。

yiyeguzhou100的专栏 1334

java如何进行内存调优_如何快速掌握Java的性能调优技巧

描述大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论。好吧,这也不完全错。优化一个应用做到性能最优化可能不是件容易的任务,但是这并不意味着你没有相关的知识就什么也做不了。这里有一些易于遵循的建议和最佳实践可以帮助你创建一个性能良好的应用程序。这些建议的大部分都是针对 Java 语言的。但是也有一些是跟语言无关的,你可以运用到任意的应用和程序中。在我们学习特定的 Java...

weixin_42674361的博客 1146

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1950

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

墨鸦的博客 4万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 计数器_【性能调优专题】【Jvm性能调优】【Jvm内存模型】【程序计数器详解】...

这一期我们讲一下JVM模型中的程序计数器,我们继续来回顾下JVM模型一、JVM模型概述  java虚拟机(JVM)在java程序运行的过程中,会将它所管理的内存划分为若干个不同的数据区域,这些区域有的随着JVM的启动而创建,有的随着用户线程的启动和结束而建立和销毁。一个基本的JVM运行时内存模型如下所示:  上图展示的是“JAVA SE7”的JVM虚拟机规范。注意,虚拟机规范并不是一成不变的,Or...

weixin_39603622的博客 114

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JVM调优深度剖析:内存模型、垃圾收集、工具与实战

在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。

喜欢猪猪 2460

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

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

java栈内存线程_【性能调优专题】【Jvm性能调优】【Jvm内存模型】【线程栈及栈帧内部结构详解】...

这期带大家理解Java虚拟机执行引擎是如何运行的?这次要介绍的栈帧(Stack Frame),就是Java虚拟机中的虚拟机栈(Virtual Machine Stack)的基本元素,它也是用于支持Java虚拟机进行方法调用和方法执行背后的数据结构,了解了它就可以更好地理解Java虚拟机执行引擎是如何运行的。什么是栈帧?正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器、虚拟机栈、本地方法...

weixin_32778881的博客 142

java对象复制 忽略空值_【性能调优专题】【Jvm性能调优】【Jvm内存模型】【堆内存分代机制及对象生命周期详解】

JVM内存分代策略JVM 根据对象的存活周期不同,把堆内存划分为三块,一般为新生代、老年代、永久代(对于HotSpot虚拟机而言),在绝大多数情况下,新创建的对象首先分配在eden区,在一次新生代回收之后,如果对象还存活,则进入s0或者s1,每经过一次新生代回收,对象如果存活,它的年龄就会加1。当对象的年龄达到一定条件后,就会被认为是老年对象,从而进入老年代。常量、类变量、类信息等会存放在永久代中...

weixin_39667452的博客 164

高性能Java应用的GC调优策略:从理论到实战的全景指南

在GC调优实践中,一些问题反复出现。以下是最常见的GC问题及其诊断和解决方案。GC调优是Java性能优化的重要一环,但并非全部。真正的性能优化需要系统化思维。

2401_88760782的博客 711

深入浅出JVM 及JVM调优(一)

### 一、概述 JVM 是 Java 程序运行基础,本文就JVM 内存模型、Java 的类加载机制、常用的 GC 算法这三个知识点进行讲解。以下是JVM知识点汇总,欢迎小伙伴们补充。 ### 二、JVM内存模型 线程独占:栈,本地方法栈,程序计数栈 线程共享:堆,方法区 栈:用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈 本地方法栈:和栈类似,不同的是,执行 Java 方法使用栈,而执行 native 方法使用本地方法栈。 程序计数器:保存着

jinmaoyue的博客 327

Java内存模型

递归为什么会一发 java.lang.StackOverflowError– 递归过深,栈帧数超出虚拟栈深度 元空间 metaspace 和 永久代 permgen metaspace permgen 内存 使用本地内存 使用jvm的内存 metaspace 优势 Java堆 对象实例的分配区域 GC管理的主要区域 JVM三大性能调优参数 -Xms ...

weixin_38885024的博客 163

第一部分:JVM 基础架构(第二节:JVM 内存模型与运行时数据区详解)

JVM内存模型与运行时数据区概述 Java虚拟机(JVM)内存分为多个数据区域,包括程序计数器(线程私有)、虚拟机栈(存储栈帧)、本地方法栈、Java堆(存储对象实例)、方法区(存储类信息)、运行时常量池和直接内存。各区域在内存共享、异常类型和存储内容上存在差异,如堆内存溢出可通过-Xmx参数调整,栈溢出需检查递归深度。内存区域间存在交互关系,合理配置这些区域对性能调优和故障诊断至关重要。常见问题包括堆溢出、栈溢出和元空间溢出等,可通过相应参数进行优化。

weixin_39956506的博客 799

程序监控与调优---------Java篇

梳理下,针对java工程的监控与对应的调优.主要分为两部分,第一部分是基础知识预备(这样才有思路去调优啊~),第二步是是监控工具的使用(针对不同的监控对象,会选择一个监控工具).另外欢迎骚扰。......

难得糊涂 1399

揭秘Java内存模型与JVM调优实战:1024开发者不容错过的底层原理剖析

掌握Java内存模型与JVM调优核心方法,解决高并发场景下的性能瓶颈。通过1024 Java开发者专属技术沙龙报名,深入剖析底层原理,涵盖GC机制、内存泄漏排查与优化策略,提升系统稳定性与执行效率,实战经验全分享,值得收藏。

LiteTrans的博客 814

JVM

1.JVM三大性能调优参数,JVM几个重要的参数 2.JVM调优 3.JVM内存管理,JVM的常见垃圾收集器,G1垃圾收集器。GC调优,MinorGC,FullGC触发条件 4.java内存模型 5.Java垃圾回收机制 6.JVM怎么样判断一个对象是否可回收,怎样的对象才能作为GC root 7.OOM说一下?怎么排查?哪些会导致OOM?OOM出现在什么时候? 8.什么是Full ...

heting717的博客 181

高性能Java应用开发技巧:内存管理与性能优化策略

在现代软件开发领域,Java凭借其跨平台性、丰富的库支持和强大的生态系统,成为了构建高性能应用的首选语言之一。然而,随着应用规模的不断扩大,如何高效管理内存并优化性能,成为开发者面临的核心挑战。通过深入理解Java内存模型,采取合理的内存管理策略,结合有效的性能优化手段,开发者可以构建出更加稳定、高效的Java应用。缓存是提高应用性能的有效手段。例如,通过-Xms和-Xmx设置堆内存的初始大小和最大大小,避免频繁的垃圾回收。对象池预先创建一定数量的对象,供应用复用,减少对象创建和销毁的开销,提高系统性能。

searchboy2025的博客 9
上一篇: Java 性能优化
下一篇: Java 深入理解与感悟
程xxx
博客等级 码龄14年 7粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值