摘要: 一、自旋锁与互斥锁 java中的锁整体分为两大类,基于synchronized关键字的互斥锁和基于CAS操作的自旋锁 synchronized:串行执行阻塞的、用户态内存态切换的重量级锁。(监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的) CAS:非阻塞的自旋、线程上下文切换 异 阅读全文
posted @ 2020-04-30 18:30 cao_xiaobo 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 一、synchronized 的原理 JVM 基于进入和推出Monitor对象来实现方法和同步代码块,但两者的实现细节不同。 synchronize 修饰的同步代码块:使用monitorenter 和 monitorexit 指令实现; synchronize 修饰的方法并没有 monitorent 阅读全文
posted @ 2020-04-27 15:45 cao_xiaobo 阅读(2420) 评论(0) 推荐(1) 编辑
摘要: 前言 Java中提供这四种引用类型主要有两个目的: 可以让程序员通过代码的方式决定某些对象的生命周期; 有利于JVM进行垃圾回收 java.lang.ref包下的引用类结构图 一、强引用 特点:GC时,永远不会被回收 是指创建一个对象并把这个对象赋给一个引用变量。比如: Object object 阅读全文
posted @ 2020-04-27 02:37 cao_xiaobo 阅读(1401) 评论(0) 推荐(0) 编辑
摘要: 恢复内容开始 一、为什么要使用类加载器? Java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如: 1.编写一个面向接口的应用程序,可能等到运行时再指定其实现的子类; 2.用户可以自定义一个类加载器,让程序在运行时 阅读全文
posted @ 2020-04-26 02:11 cao_xiaobo 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 对象头在32位系统上占用8B,64位系统上占16B。 无论是32位系统还是64位系统,对象都采用8字节对齐。Java在64位模式下开启指针压缩,比32位模式下,头部会大4B(mark区域变位8B,kclass区域被压缩),如果没有开启指针压缩,头部会大8B(mark和kclass都是8B),换句话说 阅读全文
posted @ 2020-04-20 04:31 cao_xiaobo 阅读(1057) 评论(0) 推荐(0) 编辑
摘要: HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) 1.对象头 HotSpot虚拟机的对象头(Object Header)包括两部分信息, (1)第一部分MarkWord:用于存储对象自身的运行时 阅读全文
posted @ 2020-04-20 04:24 cao_xiaobo 阅读(971) 评论(0) 推荐(1) 编辑
摘要: 栈帧中存储的有 局部变量表 操作数栈(或表达式栈) 动态链接(或指向运行时常量池的方法引用) 方法返回地址(或方法正常退出时或者异常退出时的定义) 一些附加信息 一、局部变量表 是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在 Java 程序编译为 Class 文件时,就在方法的 阅读全文
posted @ 2020-04-20 04:20 cao_xiaobo 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 方法区就用来存储了每一个类的结构信息,不同的虚拟机实现是不一样的,有些叫永久代,有些称为元空间 1、类型信息 类型的全限定名 超类的全限定名 直接超接口的全限定名 类型标志(该类是类类型还是接口类型) 类的访问描述符(public、private、default、abstract、final、sta 阅读全文
posted @ 2020-04-20 03:43 cao_xiaobo 阅读(369) 评论(0) 推荐(0) 编辑
摘要: java设计者将内存划分为不同的区域,每一块区域都有它自已的职责,粗略的分工如下:堆区是专门用来存储对象的,方法区是专门用来保存类的结构信息的,虚拟机栈是专门用来执行java方法的,本地方法栈是专门用来执行native方法的,程序计数器是专用记录线程执行字节码所执行的行号记录的。java内存区域统称 阅读全文
posted @ 2020-04-20 03:37 cao_xiaobo 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器 阅读全文
posted @ 2020-04-20 03:21 cao_xiaobo 阅读(820) 评论(0) 推荐(0) 编辑