目录
Java对象保存在内存中时,由以下三部分组成:
1,对象头
2,实例数据
3,对齐填充字节
java的对象头由以下三部分组成:
1,Mark Word
2,指向类的指针
3,数组长度(只有数组对象才有)
Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。
Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。
Mark Word在不同的锁状态下存储的内容不同,在32位JVM中是这么存的:
锁状态 |
25bit |
4bit |
1bit |
2bit |
|
23bit |
2bit |
是否偏向锁 |
锁标志位 |
||
无锁 |
对象的HashCode |
分代年龄 |
0 |
01 |
|
偏向锁 |
线程ID |
Epoch |
分代年龄 |
1 |
01 |
轻量级锁 |
指向栈中锁记录的指针 |
00 |
|||
重量级锁 |
指向重量级锁的指针 |
10 |
|||
GC标记 |
空 |
11 |
其中无锁和偏向锁的锁标志位都是01,只是在前面的1bit区分了这是无锁状态还是偏向锁状态。
JDK1.6以后的版本在处理同步锁时存在锁升级的概念,JVM对于同步锁的处理是从偏向锁开始的,随着竞争越来越激烈,处理方式从偏向锁升级到轻量级锁,最终升级到重量级锁。
JVM一般是这样使用锁和Mark Word的:
1,当没有被当成锁时,这就是一个普通的对象,Mark Word记录对象的HashCode,锁标志位是01,是否偏向锁那一位是0。
2,当对象被当做同步锁并有一个线程A抢到了锁时,锁标志位还是01,但是否偏向锁那一位改成1,前23bit记录抢到锁的线程id,表示进入偏向锁状态。
3,当线程A再次试图来获得锁时,JVM发现同步锁对象的标志位是01,是否偏向锁是1,也就是偏向状态,Mark Word中记录的线程id就是线程A自己的id,表示线程A已经获得了这个偏向锁,可以执行同步锁的代码。
4,当线程B试图获得这个锁时,JVM发现同步锁处于偏向状态,但是Mark Word中的线程id记录的不是B,那么线程B会先用CAS操作试图获得锁,这里的获得锁操作是有可能成功的,因为线程A一般不会自动释放偏向锁。如果抢锁成功,就把Mark Word里的线程id改为线程B的id,代表线程B获得了这个偏向锁,可以执行同步锁代码。如果抢锁失败,则继续执行步骤5。
5,偏向锁状态抢锁失败,代表当前锁有一定的竞争,偏向锁将升级为轻量级锁。JVM会在当前线程的线程栈中开辟一块单独的空间,里面保存指向对象锁Mark Word的指针,同时在对象锁Mark Word中保存指向这片空间的指针。上述两个保存操作都是CAS操作,如果保存成功,代表线程抢到了同步锁,就把Mark Word中的锁标志位改成00,可以执行同步锁代码。如果保存失败,表示抢锁失败,竞争太激烈,继续执行步骤6。
6,轻量级锁抢锁失败,JVM会使用自旋锁,自旋锁不是一个锁状态,只是代表不断的重试,尝试抢锁。从JDK1.7开始,自旋锁默认启用,自旋次数由JVM决定。如果抢锁成功则执行同步锁代码,如果失败则继续执行步骤7。
7,自旋锁重试之后如果抢锁依然失败,同步锁会升级至重量级锁,锁标志位改为10。在这个状态下,未抢到锁的线程都会被阻塞。
该指针在32位JVM中的长度是32bit,在64位JVM中长度是64bit。
Java对象的类数据保存在方法区。
只有数组对象保存了这部分数据。
该数据在32位和64位JVM中长度都是32bit。
对象的实例数据就是在java代码中能看到的属性和他们的值。
因为JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。
作者:lkforce 来源:CSDN 原文:https://blog.csdn.net/lkforce/article/details/81128115?utm_source=copy
一、题目二、测试代码解法一:递归1、终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束;2、返回值:每一层调用都返回排序好的链表头;3、递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN
在工作中大家肯定遇到过要进入不同的服务器执行命令,这个脚本实现了进入不同服务器执行相同命令,节省了大量的时间。脚本如下所示:#!/bin/bashFILE_LIST=/opt/myshell/listCMD=$1NAME=$2for IP in `cat $FILE_LIST|grep -v '^#'|grep "|$NAME" |awk -F'|' '{print $1}'`do echo "--------------------$IP------------------ "
清华大学开源网站镜像站网址:https://mirrors.tuna.tsinghua.edu.cn/进入之后在搜索框中搜索“ubuntu”
解决ScrollView嵌套RecyclerView只显示一行的一种比较简单的方法ScrollView嵌套RecyclerView用多了,有些时候就会发现RecyclerView的数据只显示一行。具体情况不是很清楚,只是知道一种解决的办法,话不多说 <RelativeLayout android:layout_width="mat
题目: 给定你一个数字 如:15 15可分解为7+84+5+61+2+3+4+5再如:88不可分解为任何连续的正整数之和所以输出NONE此题就是给定一个数字如果这个数字可以分解为几个连续的正整数之和那么就输出所有的形式,如果不能就输出NONE今天这道题困扰了我好久,最后发现,一开始求和的时候算错了。 输入数n,设置起始位置i,再遍历连续正整数的长度k,由公式计算出 s
生成函数又有奇妙的性质。$F(x)=C(x)*F(x)*F(x)+1$然后大力解方程,得到一个带根号的式子。多项式开根有解只与常数项有关。发现两个解只有一个是成立的。然后多项式开根、求逆。不太会算复杂度为什么是$n\log {n}$的。开根号里套了一个求逆,不应该是两个$\log$?#include <map>#include <cmath...
ARCGIS中某字段递增赋值在地段计算器中使用一下代码:rec=0def autoIncrement(): global rec pStart = 1 pInterval = 1 if (rec == 0): rec = pStart else: rec = rec + pInterval return rec然后在字段里输入autoIncrement(...
解析常见的协议TCP/IP协议HTTP协议什么是超文本什么是传输什么是协议优点总结HTTPSSSL/TLS协议分层模型TCP/IPOSI一个HTTP的请求过程二层转发以及三层路由HTTP/1HTTP/1.0HTTP/1.1队头阻塞问题HTTP/2websocket特性TCP/IP协议三次握手和四次挥手三次握手第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers
今看到一篇ODOO11开发文档,希望能够分享给大家。原文地址http://www.docin.com/DocinViewer-2137881329-144.swf
https://www.cnblogs.com/skyofbitbit/p/3651270.htmlhttps://www.cnblogs.com/imstudy/p/10289944.html音频编解码常用的实现方案有三 种: 第一种就是采用专用的音频芯片对 语音信号进行采集和处理,音频编解码算法集成在硬件内部,如MP3编解码芯片、语音合成 分析芯片等。使用这种方案的优点就...
在强大的模板、插件的支持下,WordPress从一个博客后台工具,直接升级为CMS内容发布系统,已经是没有任何疑义的一个事实。但是WordPress的文章链接,以xxx.xxx.xxx.xxx/?p=123之类的形式存在,对于网站的SEO来说,确实是不太友好。对于这个问题,其实wordpress本身是有支持的。在wordpress里,链接地址可以是“固定链接”的形式。这种形式,我们很多时候称它为“...
由于项目需要,准备开发一个分布式限速服务,参考:分布式限速,会应用到RPC服务,所以需要先调研主流RPC服务的性能,可靠,易用性。Go RPCgolang原生的rpc服务GRPC底层协议基于HTTP2RPCX...