java对象底层实现-创新互联

一个java对象信息由以下几个部分组成

成都创新互联公司2013年成立,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元庆云做网站,已为上家服务,为庆云各地企业和个人服务,联系电话:18980820575
markword 记录着锁状态,GC息,hashCode
klass pointer
m
padding
package cn.sensorsdata.exercise.MultiThread;

import org.openjdk.jol.info.ClassLayout;

public class HelloJOL {

    public static void main(String[] args) {


        Object object = new Object();

        System.out.println(ClassLayout.parseInstance(object).toPrintable());

    }
}

1 当代码为上面写法时,执行的java对象模型为下面结果

2 当代码为下面的时,给对象加锁则,对象模型为下面的

package cn.sensorsdata.exercise.MultiThread;

import org.openjdk.jol.info.ClassLayout;

public class HelloJOL {

    public static void main(String[] args) {


        Object object = new Object();

        System.out.println(ClassLayout.parseInstance(object).toPrintable());
        synchronized (object){
            System.out.println(ClassLayout.parseInstance(object).toPrintable());
        }
    }
}

加锁后执行的结果为:

hotspot的内部实现: 在java对象模型里有个markword 记录着锁信息(无锁态,偏向锁,轻量锁,重量锁,以及GC的信息,以及hashcode。

概念普及:用户态与内核态

JDK早期:synchronized叫做重量级锁,因为申请锁资源必须通过kernel,系统调用操作系统,像轻量级别锁cas就是在业务处理上实现不用加锁也可以进行对象一致性保证。

无锁态->偏向锁->轻量锁(自旋锁\无锁)->重量级锁

无锁态:比如刚new 出来的对象

偏向锁: 为何会有偏向锁?多数sychronized方法,在很多情况下,只有一个线程在运行,

例如:StringBuffer中的一些sync方法,Vector中的一些方法

轻量级别锁:假如后面又有好几个线程要写,则从自旋锁升级到轻量级锁,在这个过程中,操作系统会优先给之前的线程分配锁,后面的线程不断轮询查看对象锁的状态,当锁被释放的时候就抢到锁。

重量级别锁:有线程超过十次 或者有多个线程在等待,超过线程的1/2 就升级重量锁(以前的jvm优化可以调整锁参数,现在jvm会自己做优化,自适应锁)

问题:有了轻量级别锁为什么还有重量级别锁,主要是轻量级别锁,对于那种线程执行快的情况下可以给其他线程分配到执行的资源(占用cpu资源). 如果某个线程占用时间长则这种策略会出现问题。

重量级别锁,有个队列,等待队列,将暂时排列不到的线程放到线程里面.

偏向锁升级轻量锁:只要有另一个线程访问对象就会升级轻量锁

轻量锁升级重量锁: 申请10圈都等不到锁,或者超过线程数的1/2则升级重量锁

  锁升级同步

对于锁,是操作系统的内部机制,对于某一块内存,加锁进行访问控制。

偏向锁不一定比自旋锁、轻量锁效率高。例如,业务里面有多个线程进行锁获取,这个时候就不用偏向锁,直接升级轻量锁。偏向锁还要进行锁销毁耗费时间.

  

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:java对象底层实现-创新互联
浏览路径:http://ybzwz.com/article/hsihd.html