HotSpot
Java虚拟机
SherlockCharlie
这个作者很懒,什么都没留下…
展开
-
HotSpot IO与NIO
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆原创 2020-11-16 16:47:03 · 297 阅读 · 0 评论 -
HotSpot Net
HotSpot对上层Java网络的支持主要通过Socket来支持。通过套接在TCP/IP传输控制协议层和HTTP/FTP/SMTP应用层之间搭建桥梁。传输控制层用操作系统层面实现。上层协议借助Socket进一步实现,Java平台已为我们实现了方便的应用层协议。如需自行实现自定义协议,可借助Socket来实现,比如Hadoop中的YARN调度器就借助Socket和NIO来实现分布式调度。一.Socket为了调试Socket修改Hello类的内容如下public class Hello{ pub原创 2020-11-10 18:37:03 · 559 阅读 · 0 评论 -
HotSpot 反射
Java是一门静态语言,但是Java的反射赋予了Java动态的能力。Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。反射功能可以让我们在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方原创 2020-11-08 19:00:58 · 286 阅读 · 0 评论 -
HotSpot HashCode
在Java中每个对象都有一个hash值。无论何时,对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码。一.用处在Object中通过hashCode方法来提供hash值子类可以重写此方法。以提供通常容器数据原创 2020-11-06 20:03:59 · 265 阅读 · 0 评论 -
HotSpot String常量池
HotSpot中使用StringTable来缓存字符串常量,以提高程序的运行性能。在Java语言中String类被final关键字修饰,意味着String类不能被继承,并且它的成员方法都默认为final方法;字符串一旦创建就不能再修改。String实例的值是通过字符数组实现字符串存储的。使用字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低。一.Stri原创 2020-11-06 20:00:12 · 419 阅读 · 0 评论 -
HotSpot Park原理
上一篇了解了HotSpot关于CAS的支持,作为JUC并发支持,HotSpot提供了Park来支持线程的挂起,唤醒操作。在synchronized层面ObjectMonitor通过ParkEvent来操作线程挂起唤醒,在AQS层面UnSafe通过Parker来操作线程的挂起唤醒。...原创 2020-10-31 16:07:05 · 386 阅读 · 0 评论 -
HotSpot CAS原理
在Java中CAS(compareAndSet()方法的简称)是JUC的基石之一,HotSpot通过UnSafe类来实现CAS。CAS语义:如果当前状态值等于预期值,则以原子方式同步状态设置为给定的更新值,从volatile的角度来看CAS需要同时具备volatile读写内存语义。编译器不会对volatile写以及volatile写前面的指令重排序,要同时实现volatile读和volatile写的内存语义,编译器不能对CAS与CAS前面和后面的任意指令做重排序。一.AtomicIntegerAtomi原创 2020-10-27 20:19:02 · 519 阅读 · 2 评论 -
HotSpot final原理
Java中的final很重要,final关键字可用来修饰类,方法,变量。修饰类时表示该类不可被继承。修饰方法时表示该方法不可被重载。修饰变量时表示不可变值或引用。JSR-133通过为final域增加写和读重排序规则,为Java程序提供初始化安全保障:只要对象是正确构造的(没有this逃逸),那么就不需要使用同步。任意线程都能看到这个final域在构造函数中被初始化后的值。一.final类在HotSpot中对final类,在类加载阶段验证其是否继承了final类。hotspot/src/share/vm原创 2020-10-21 15:41:00 · 401 阅读 · 2 评论 -
HotSpot volatile原理
关于HotSpot中volatile的实现之前,需要先探讨一下Java的内存模型。为了提高程序的执行性能,编译器和处理器常常会对一段指令做重排序。在单线程环境下指令重排序可以显著提高程序的执行性能,但在多线程下便会出现一致性问题。Java通过统一的内存模型,锁,内存屏障等手段来处理这种一致性问题。一.Java内存模型在Java中,堆内存在线程之间共享,局部变量不在线程间共享。JMM决定一个线程堆共享变量的写入何时对另一个线程可见,JMM定义了线程私有本地内存与主内存的抽象关系,提供统一的编程模型。线程间原创 2020-10-20 11:28:30 · 578 阅读 · 0 评论 -
HotSpot ObjectMonitor原理
Java Monitor 从两个方面来支持线程之间的同步,即:互斥执行与协作。 Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行 , 使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。这些方法在 Object 类上被定义,会被所有的 Java 对象自动继承。HotSpot通过ObjectMonitor提供对Java层面的wait(),notify(),synchronized的支持。一.monitorhots原创 2020-10-02 16:21:09 · 1180 阅读 · 0 评论 -
HotSpot synchronized原理
Java通过对synchronize关键字来支持多线程同步。在字节码层面synchronize表现为monitorenter, monitorexit, 同时外加一个flags标志区分synchronize的同步作用域。synchronized用的锁是存在Java对象头里的,虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)和Klass Pointer(类元数据指针),其中Klass Point是是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例,Mark Wor原创 2020-09-30 16:42:49 · 573 阅读 · 0 评论 -
HotSpot CMS收集器
HotSpot中CMS收集器通过牺牲系统吞吐量来实现响应速度优先。适合追求垃圾收集速度的服务器上。CMS收集器属于分代收集器年轻代算法并发复制算法,老年代算法为并发标记清除算法。年轻代分代为ParNewGeneration,老年代分代为ConcurrentMarkSweepGeneration。适用于对响应时间要求高的应用场景。一.CMS收集器初始化使用-XX:+UseConcMarkSweepGC启用CMS。hotspot/src/share/vm/runtime/init.cppji原创 2020-09-28 17:43:11 · 406 阅读 · 0 评论 -
HotSpot Serial收集器
GC在HotSpot中的地位举足轻重。JDK9为止提供了四种收集器:Serial,CMS,Parallel,G1。按机器规模,分代类型,吞吐量,延时,CPU利用率等,结合不同的算法,每种收集器都有各自适用的使用场景,同时衍生出多种GC组合配置。今天来看Serial收集器。Serial收集器属于分代GC收集器。年轻代主要算法为标记复制算法,老年代主要算法为标记压缩算法。Serial和SerialOld都是单线程GC。特点是需要STW。适用于响应时间要求不高的桌面应用或开发调试环境。一. Seri原创 2020-09-23 17:21:17 · 322 阅读 · 0 评论 -
HotSpot 对象的创建
HotSpot中对象是是通过对象模型来表示的,具体来说就是oop和klass来表示,oop代表了一个Java对象在堆内存中的表现形式。使用klass来表示Java类的信息。虚拟机创建Java对象时,会在按照klass所提供的类信息,在内存中创建一个oop对象,具体的内存可能是线程TLAB会堆空间。然后该oop对象的地址会赋给一个变量,这个变量可能在线程栈上或直接来自堆空间对此oop的引用。一.对象模型hotspot/src/share/vm/oops/oop.hppHotSpot内部oop的描述如下,原创 2020-09-22 16:55:46 · 1538 阅读 · 0 评论 -
HotSpot C1编译器与栈上替换
上一篇主要分析了HotSpot模板解释器和汇编器的实现,相比于c解释器,通过汇编器和模板解释器将字节码指令编译成汇编指令,显著提升了HotSpot的性能。除此之外HotSpot更进一步实现了C1,C2编译器用于在服务端选择性的进一步编译优化指令。此外提供了Tiered分层编译,内置LLVM,AOT编译,GraalVm全栈...原创 2020-09-09 19:51:19 · 1917 阅读 · 0 评论 -
HotSpot汇编器与模板解释器
上一篇我们从查看了HotSpot线程与桩(stub)的实现,其中桩代码的实现涉及到手工汇编(__ 前缀的代码),这些手工汇编最终都是通过HotSpot内部汇编器生成不同硬件架构对应的汇编指令机器码。虚拟机内部根据不同的cpu生成了各自对应的汇编指令以实现跨平台兼容。今天我们来看HotSpot汇编器的实现。hotspot/src/share/vm/runtime/stubRoutines.cppBufferBlob是CodeBlob的一种,BufferBlob并向codecacche申请分配一块CodeH原创 2020-09-08 18:34:34 · 956 阅读 · 0 评论 -
HotSpot线程与栈帧
上一篇主要查看了HostSpot的类解析过程,本质上是字节码文件读取解析的过程,解析的结果封装到对应的模型当中供虚拟机使用。HotSpot是基于堆栈的虚拟机,HotSpot执行引擎需要通过线程来划分管理方法栈。再深入HotSpot执行引擎如何运行之前,本篇主要来看HotSpot线程。1.线程的创建在Java种创建一个线程通常使用两种方式:extends Thread 或 implement Runnable,这两种方式是一回事(Thread实现了Runnable)。线程start()以后会关联到Hos原创 2020-09-07 17:22:25 · 1155 阅读 · 0 评论 -
HotSpot 类解析
上一篇了解了Java字节码文件组织结构,继HotSpot类加载后本篇来探讨HotSpot类解析。Java字节码文件是以二进制流的形式由HotSpot加载,然后HotSpot将字节码解析转换成虚拟机内部的对象模型。并将这个对象模型存储在虚拟机的元空间供虚拟机引擎重复使用。所以关于类解析有三个问题:类如何被解析,对象模型是什么样的,元空间(MetaSpace)的存储结构。在类加载一篇我们知道字节码的二进制流由ClassFileStream加载到内存,然后由ClassFileParser解析。一,HotSpot原创 2020-08-17 17:23:55 · 1314 阅读 · 0 评论 -
Java字节码文件
上一篇我们分析了字节码文件加载到虚拟机的过程,在继续深入class文件类解析前先了解下class文件格式。Java虚拟机中每一个class文件都对应着唯一一个类或接口的定义信息。每个class文件由字节流组成。在描述class文件格式时使用类c伪结构体。结构体中的类数组表是由任意数量的可变长度的项组成的复合结构,表中的每项长度不固定一,Java字节码文件1. 类文件结构ClassFile { u4 magic; //魔数 0xCAFEBABE u2 minor_version; //副版本号原创 2020-08-10 16:57:47 · 1124 阅读 · 0 评论 -
HotSpot 类加载
上一篇我们从使用一个类来断点分析了HotSpot的启动流程。今天我们来看HotSpot的类加载。首先必须明确的是在HotSpot启动的过程中,在init_globals()函数中universe2_init()函数中已经预加载了系统运行必须的Java类。所以我们先分析预加载的系统运行必须的类,然后再看JVM启动以后我们的Hello类是如何加载的。1. HotSpot内部预加载类在开始分析之前需要了解HotSpot中几个C++类,vmSymbols.cpp使用宏定义类诸如java_lang_System等原创 2020-08-03 10:52:15 · 881 阅读 · 0 评论 -
HotSpot 启动流程
本篇是JVM系列开篇,主要分析JVM的启动流程。JVM系列主要以HotSpot为主,按HotSpot各模块来一一展开,包括Class类文件成分,字节码文件加载及解析,HotSpot内存结构,JVM解析器,Kclass-Oop模型,垃圾回收器,执行引擎,字节码指令系统,JIT, AOT, 逃逸分析,栈顶缓存等等。一. HotSpot的组成结构JVM(全称Java Virtual Machine), 是一台虚拟的计算机,本身不跨平台。是Java,Python等编程语言生成的字节码文件的执行平台。具体的JVM原创 2020-06-15 16:40:56 · 2260 阅读 · 0 评论 -
HotSpot 源代码编译
编译环境Windows10,VMware15,Ubuntu18.04, 虚拟环境。PC机,内存32G,CPU 16 核心,I7八代。Ubuntu18.04 虚拟机。环境准备安装Boot JDK,下载Linux版Oracle JDK8,解压安装到/usr/lib下, 执行gedit ~/.bashrc 文件末尾追加如下export JAVA_HOME=/usr/lib/jd...原创 2020-04-26 15:15:29 · 2253 阅读 · 0 评论