JMM-Java内存模型
JMM-Java内存模型
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
偏向锁升级、批量重偏向&撤销、Java对象头、Markword构成等
批量重偏向和批量撤销理解:https://blog.csdn.net/qq_33553218/article/details/107699356理解Java中的偏向锁,轻量级锁,重量级锁:https://blog.csdn.net/dbc_121/article/details/105453101java对象头信息:https://blog.csdn.net/zhaocuit/article/details/100208879并发编程:批量重偏向、批量撤销:https://blog.csdn.n原创 2021-02-06 12:05:38 · 419 阅读 · 0 评论 -
缓存行 及 内存补齐 padding
缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。为了让可伸缩性与线程数呈线性关系,就必须确保不会有两个线程往同一个变量或缓存行中写。两个线程写同一个变量可以在代码转载 2020-09-19 16:08:23 · 1792 阅读 · 0 评论 -
【指针压缩】简单聊一聊UseCompressedOops UseCompressedClassPointers这两个JVM参数
jdk6之后默认开启,jdk7下 xmx小于32g默认开启。https://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.htmlUseCompressedOops:普通对象指针压缩,oops:ordinary object pointerUseCompressedClassPointers:类指针压缩这两者有什么作用呢?拿新建一个对象来说:Object o = new Ob.转载 2020-09-19 15:53:05 · 1770 阅读 · 0 评论 -
java对象在内存的大小
前言一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些。假设有类A和B,当new A()或者new B()后,实际占用的java内存是多大呢?下面就对此进行详细分析。static class A{ String s = new String(); int i = 0;}static class B{ String s; int i;}对象大小分析转载 2020-09-19 15:31:21 · 653 阅读 · 0 评论 -
两种计算Java对象大小的方法
1 基础知识堆和栈Java在程序运动时,内存空间根据功能不同,可以分成五块,分别是寄存器,本地方法区,方法区,堆,栈。单以堆和栈来说,栈中主要存放的是基本数据类型,局部变量等,new 创建的实例对象或数据,则存放在堆中。对于栈来说,每个线程有自己独立的栈。线程结束,栈就会消失(空间就会被回收。事实上,不需要等待线程结束,随着入栈和出栈,方法运行结束,方法相关的内容就会消失)。而堆,则是大家共享的。实例对象或数据,即使不再使用,也有可能不会马上消失。因为堆内存的回收是依靠垃圾回收机制的。对转载 2020-09-19 15:28:56 · 1376 阅读 · 1 评论 -
伪共享 FalseSharing (CacheLine,MESI) 浅析以及解决方案
对象引用=markword 8个字节 padding 6个long 值 1个long,一共64个字节= 1个缓存行起因在阅读百度的发号器uid-generator源码的过程中,发现了一段很奇怪的代码:/** * Represents a padded {@link AtomicLong} to prevent the FalseSharing problem<p> * * The CPU cache line commonly be 64 bytes, here is...原创 2020-09-19 11:11:01 · 979 阅读 · 0 评论 -
缓存一致性协议(MESI)
在目前主流的计算机中,cpu执行计算的主要流程如图所示:数据加载的流程如下:1.将程序和数据从硬盘加载到内存中2.将程序和数据从内存加载到缓存中(目前多三级缓存,数据加载顺序:L3->L2->L1)3.CPU将缓存中的数据加载到寄存器中,并进行运算4.CPU会将数据刷新回缓存,并在一定的时间周期之后刷新回内存缓存一致性协议发展背景现在的CPU基本都是多核CPU,服务器更是提供了多CPU的支持,而每个核心也都有自己独立的缓存,当多个核心同时操作多个线程对...转载 2020-05-21 19:47:49 · 1432 阅读 · 0 评论 -
JVM——深入分析对象的内存布局
概述一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的。Class 本身就是一个对象,都以 KB 为单位,如果 new Integer() 为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解 JVM 是如何做的。为了表示对象的属性、方法等信息,不得不需要结构描述。Hotspot VM 使用对象头部的一个指针指向 Class 区域的方式来找到对象的 ...转载 2020-03-17 14:47:52 · 548 阅读 · 0 评论 -
重学Java-一个Java对象到底占多少内存
内存是程序员逃不开的话题,当然Java因为有GC使得我们不用手动申请和释放内存,但是了解Java内存分配是做内存优化的基础,如果不了解Java内存分配的知识,可能会带偏我们内存优化的方向。所以这篇文章我们以“一个对象占多少内存”为引子来谈谈Java内存分配。 文章基于JDK版本:1.8.0_191文章标题提出的问题是”一个对象到底占多少内存“,看似很简单,但想说清楚并不容易,希望本文的探讨...转载 2020-03-17 14:05:00 · 767 阅读 · 0 评论 -
Volatile 原理及摘要内容,DCL单例、内存屏障、JVM及底层实现
内存屏障一堵墙,上下的指令不能重排序比如 storestoreBarrier,屏障上下的2个store不能重排序保证volatile写操作前后的指令。都有屏障,无法重排序...原创 2020-02-22 18:11:45 · 762 阅读 · 0 评论 -
DCL单例模式
我们第一次写的单例模式是下面这样的:public class Singleton { private static Singleton instance = null; public static Singleton getInstance() { if(null == instance) { // line A ...转载 2020-03-13 10:28:11 · 769 阅读 · 0 评论 -
提升性能,避免伪共享(False Sharing)-缓存行填充7个long
缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。为...原创 2020-02-24 21:47:39 · 1396 阅读 · 1 评论 -
Volatile的实现及内存屏障
为什么会有内存屏障每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性能,避免每次都要向内存取。但是这样的弊端也很明显:不能实时的和内存发生信息交换,分在不同CPU执行的不同线程对同一个变量的缓存值不同。 用volatile关键字修饰变量可以解决上述问题,那么volatile是如何做到这一点的呢?那就是内存屏障,内存屏障是硬件层的概念,不同的硬件平台实现内存屏障的...转载 2020-02-22 19:43:09 · 1574 阅读 · 0 评论 -
Volatile 单例DCL情况 说明
简介是cpu指令作用保证指令执行的顺序,内存屏障前的指令一定先于内存屏障后的指令 将write buffer的缓存行,立即刷新到内存中重排列内存屏障保证指令的顺序?因为cpu和编译器会进行优化而导致指令重排列,单线程情况下,没什么影响,而多线程时,会发生与我们代码执行顺序不一样的结果。Q:CPU为何要重排序内存访问指令?在哪种场景下会触发重排序?CPU为何要重排序内存...转载 2020-02-22 19:29:10 · 870 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
http://www.importnew.com/18126.htmlvolatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于v转载 2017-10-11 18:36:30 · 1948 阅读 · 0 评论 -
剖析volatile、synchronized实现原理
前言在java并发编程中volatile和synchronized都扮演着重要的角色。两者都起到相同的作用:保证共享变量的线程可见性。与synchronized相比volatile可以看做是轻量级的synchronized,没有线程的上下文切换和调试,性能比synchronized要好很多。但需要注意的是volatile变量在复合操作的时候并不能保证线程安全,相反sychronized能。下面...转载 2020-02-20 12:19:01 · 752 阅读 · 0 评论 -
Java volatile关键字内存原语
一、简述 volatile特性:实现最轻量级的同步。 volatile关键字的内存原语主要包含2个:1、保证volatile修饰的变量对所有线程的可见性。2、禁止指令重排序优化。二、案例代码 先给一个经典的错误案例:package com.hy.current;public class VolatileTest {private ...转载 2020-02-20 11:56:16 · 868 阅读 · 0 评论 -
JMM和底层实现原理 & volatile实现原理
https://www.jianshu.com/p/8a58d83352701.并发编程领域的关键问题1.1 线程之间的通信线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。在消息传递...转载 2019-07-29 19:22:02 · 709 阅读 · 1 评论 -
JMM简介
Java的内存模型JMM(Java Memory Model)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存...转载 2019-07-29 19:21:11 · 11792 阅读 · 1 评论 -
java中JVM和JMM之间的区别
https://blog.csdn.net/zhaomengszu/article/details/80270696最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。一 jvm结构jvm的内部结构如下图所示,这张图很...转载 2019-07-29 19:20:19 · 1301 阅读 · 0 评论 -
【深入理解JVM】:Java内存模型JMM
https://blog.csdn.net/u011080472/article/details/51337422多任务和高并发的内存交互多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能...转载 2019-07-29 19:12:46 · 579 阅读 · 0 评论 -
Java线程工作内存与主内存变量交换过程及volatile关键字理解
1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。此处的所谓内存模型要区别于通常所说的虚拟机堆模型:2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示:原子操作的规则(部分):1) read,load必须连续执行,但是不保证原子性。2) store,write必须连续执行,但是不...转载 2019-07-16 18:46:55 · 990 阅读 · 0 评论