jvm
文章平均质量分 92
striveb
趁年轻,多吃点苦吧
展开
-
深入理解Java虚拟机之运行时数据区域
一.运行时数据区域有哪些?首先,我们先来看一张图:如上面的图所示,运行时内存区域主要分为:1.程序计数器,2.Java虚拟机栈,3.本地方法栈,4.Java堆,5.方法区等等,下面就一个个来剖析一下。二.这些区域都有哪些作用?首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运...原创 2018-11-03 12:18:13 · 214 阅读 · 0 评论 -
深入理解Java虚拟机之Java内存模型与线程
1 概述除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性能的高低好坏,每秒事务处理数(TransactionsPer Second,TPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。对于计算量相同的任务,程序线程并发协调得越有条不紊,效率自然就会越高;反之,线程之...原创 2019-01-22 11:51:31 · 413 阅读 · 0 评论 -
深入理解Java虚拟机之虚拟机字节码执行引擎
目录1 概述2 运行时栈帧结构2.1 局部变量表2.2 操作数栈2.3 动态连接2.4 方法返回地址2.5 附加信息3 方法调用3.1 解析3.2 分派1 静态分派2 动态分派3 单分派和多分派4 虚拟机动态分派的实现3.3 动态类型语言的支持4 基于栈的字节码解释执行引擎4.1 解释执行4.2 基于栈的指令集和基于寄存器的指...原创 2019-01-10 10:19:22 · 271 阅读 · 0 评论 -
JVM的符号引用和直接引用
转自:https://www.cnblogs.com/shinubi/articles/6116993.html在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用。1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Clas...转载 2019-01-15 09:58:51 · 211 阅读 · 0 评论 -
深入理解Java虚拟机之垃圾收集器和内存分配与回收策略
垃圾收集器主要包括:Serial收集器,ParNew收集器,Parallel Scavenge收集器,CMS收集器和G1收集器等。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。...原创 2019-01-08 21:48:29 · 296 阅读 · 0 评论 -
深入理解Java虚拟机之JVM垃圾回收
1.JVM内存分配与回收Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。当创建一个对象的时候,首先是在堆里面的新生代(或者叫做年轻代)的Eden区分配内存,当新生代内存满了之后,就会触发一次Young GC,然后将Eden区还在使用的对象复制到S1区(也称为From区),这样Eden又会空出来了,当E...原创 2019-01-08 21:37:46 · 254 阅读 · 0 评论 -
Java并发机制的底层实现原理
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。一、volatile的应用1.volatile的定义与实现原理Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了v...原创 2019-01-24 13:05:38 · 157 阅读 · 2 评论 -
深入理解Java虚拟机之编译期优化
1 概述Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把.java文件转变成.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把*....原创 2019-01-18 23:34:00 · 281 阅读 · 0 评论 -
深入理解java虚拟机之Java对象头
一.对象头包含的信息1.Mark Word:这一部分主要包括 存储对象自身的运行时数据,如哈希码(HashCode)、 GC分代年龄、 锁状态标志、 线程持有的锁、 偏向线程ID、 偏向时间戳等。注意这里的1bit,主要是表名是否是偏向锁,如果是0的话,表示是无锁,如果是1的话,表示是偏向锁。由于对象需要存储的运行时数据很多,其实已经超出了32位、64位Bitmap结构所能记录...原创 2018-11-08 16:47:11 · 1027 阅读 · 0 评论 -
深入理解Java虚拟机之创建对象,即创建一个类的过程
一.对象的创建1.类加载检查和分配内存虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、 解析和初始化过。 如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。 对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Ja...原创 2018-11-08 16:18:30 · 778 阅读 · 0 评论 -
深入理解Java虚拟机之线程安全与锁优化
1 Java语言中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。1.不可变在Java语言中(特指JDK 1.5以后,即Java内存模型被修正之后的Java语言),不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何...原创 2019-01-22 11:58:28 · 468 阅读 · 0 评论