首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解java虚拟机

以上问题在《深入理解java虚拟机》这本书里都有详尽的解答。...虚拟机栈 线程私有, 生命周期与线程相同 描述java方法执行的内存模型:每个方法都会创建一个栈帧用于存储局部变量,方法出口,操作数栈等信息。...对应java代码为:new,设置静态字段,调用静态方法 java.lang.reflect包对类进行反射时 初始化一个类时,如果父类还没有被初始化时初始化父类(接口没有这个要求) 虚拟机启动时,主类(main...运行时栈结构 1.1 概述 支持方法调用和执行的数据结构 处于jvm内存模型中的java虚拟机栈区域 存储了局部变量表,操作数栈,动态连接,方法返回地址等信息 每个方法的调用都对应虚拟机栈的入栈到出栈过程...方法调用 2.1 解析 2.2 分派 静态分派 动态分派 单分派和多分派 虚拟机动态分派实现 3. 方法的执行 解释执行 编译执行 九. java内存模型 1.

57751

深入理解JAVA虚拟机《一》

2.Java虚拟机栈(线程私有) 描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等。...3.本地方法栈(线程私有) 与虚拟机栈所发挥的作用是非常相似的,他们之间的区别的不过是本地方法栈则为虚拟机使用到的Native方法服务,虚拟机栈为虚拟机执行的Java方法(字节码)服务。...4.Java堆(线程共享) 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都要在这分配内存管理。 Java堆是垃圾收集器管理的主要区域,也称为GC堆。...提高了性能,避免在Java堆和Native堆中来回赋值数据。 本机直接内存的分配不受到Java堆大小的限制,但是会受到本机总内存大小以及处理器寻址空间的限制。...虚拟机栈和本地方法栈溢出 关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了这两种异常: 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出Stack OverflowError异常。

18000
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解Java虚拟机》笔记

那么上面这段代码是不是相当于最简单的一个虚拟机了?下面来看JVM的总体结构: ?...1: areturn 通过泛型实现的原理可以理解很多在实际中会遇到的问题,比如使用List的时候莫名其妙的类型强制转换错误。...Java虚拟机中最轻量级的同步机制:volatile,它的性质如下: 变量发生修改的时候会立刻被其他线程看到; 禁止指令重排序优化; 从Java内存模型操作的角度来看volatile的实现还是挺简单的...实现线程主要有几种方式: 使用一个内核线程(轻量级进程)来代理; 完全在用户态实现,内核都感觉不到; 用户和内核混合实现,各自做自己擅长的事情; 这里就不深入的去看了(虽然这里的介绍根没说一样),想想看都知道不同虚拟机在不同的操作系统上面的实现方式很可能是不一样...,如果想深入看还是pthread比较有意思一点。

34610

Java面试宝典】深入理解JAVA虚拟机

1.2 Java虚拟机虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于储存局部变量表、操作数栈、动态链接、方法出口 等信息。...1.3 本地方法栈   本地方法栈和虚拟机栈发挥的作用是非常类似的,他们的区别是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法(Native Method...1.4 Java堆 堆是Java虚拟机所管理的内存中最大的一块。...1.7 直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。   ...五、虚拟机类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

59310

深入理解Java虚拟机(高效并发)

循环等结构; 管程锁定规则:一个 unlock 操作先行发生于后面对于同一个锁的 lock 操作; volatile 变量规则:对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作,理解了这个原则我们就能理解为什么...3 Java 与线程 谈论 Java 中的并发,通常都是和多线程相关的。这一小节我们就讲讲 Java 线程在虚拟机中的实现。...1 Java 线程安全 那么什么是线程安全呢?可以简单的理解为多线程对同一块内存区域操作时,内存值的变化是可预期的,不会因为多线程对同一块内存区域的操作和访问导致内存中存储的值出现不可控的问题。...CAS 指令需要 3 个操作数,分别是内存位置(在 Java 中可以简单理解为变量的内存地址,用 V 表示)、旧的预期值(用 A 表示)和新值(用 B 表示)。...想进一步 Java 虚拟机的同学推荐去阅读周志明老师的原著。

39420

java(5)-深入理解虚拟机JVM

编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。...在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode)(class文件的内容),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。...以上描述截取自: 《深入理解Java虚拟机:JVM高级特性与最佳实践》 作者: 周志明 五、Java 8: 从永久代(PermGen)到元空间(Metaspace) ---- 1、 从永久代(...Sun JDK采用了token-threading的方式,感兴趣的同学可以深入了解一下。...xxd -r转换回来 通过javap来看一下它的结构 八、垃圾收集(Garbage Collect) ---- 具体看《java(9)-深入浅出GC垃圾回收机制》 Java中不需要对内存进行手动释放

72710

深入理解Java虚拟机:垃圾收集

虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因时它很难解决对象之间相互循环引用的问题。...在Java语言中,可作为 GC Roots 的队形包括下面几种: 虚拟机栈(帧栈中的本地变量表)中引用的对象。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。...当对象没有覆盖 fianlize() 方法,或者 fianlize() 方法已经被虚拟机调用过,虚拟机将这两种情况都视为 “没有必要执行”。...yes,i am still alive no,i am dead : ( ---- 回收方法区 很多人认为方法区(或者 HotSpot 虚拟机中的永久代)是没有垃圾收集的,Java 虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾手气...回收废弃常量与回收 Java 堆中的对象非常类似。

22020

深入理解Java虚拟机–javac命令

src/*.java javac src/*Class.java 如果需要编译的 .java 源文件数量较多,为缩短和简化javac命令,可以把要编译的 .java 源文件的文件名(必要时包含路径)存储到一个文件中...要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,JDK搜索到第一个包中的类G时就停止搜索,如果应用1应用2的虚拟机都从...-target # 生成特定 VM 版本的类文件 -target 命令用于指定生成的class文件将保证和哪个版本的虚拟机进行兼容。...我们可以通过-target 1.2来保证生成的class文件能在1.2虚拟机上进行运行,但是1.1的虚拟机就不能保证了。...因为java虚拟机的向前兼容行,1.5的虚拟机当然也可以运行通过-target 1.2让生成的class文件。每个版本编译器的默认-target版本是不太一样的。

1.3K10

深入理解Java虚拟机Java垃圾回收器

目前比较前沿的成果… 一、Jvm 垃圾回收器概述 我们前面提到了,垃圾回收器的 回收的内容、回收的时机以及回收的方式,接下来我们来看 Java 垃圾回收器。...虽然 Serial 收集器是最基础最老的收集器,但是迄今为止 HotSpot 虚拟机运行在 Client 模式下的默认的新生代垃圾收集器!...2、ParNew 收集器 ParNew 收集器大致可以理解为是 Serial 收集器的多线程版本,因为 ParNew 收集器除了采用并行回收的方式执行内存回收外,与 Serial 收集器之间几乎没有任何区别...Parallel Scavenge 的特点是其关注重点为吞吐量,高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算,但也就是说它的线程单次停止时间可能更长,因此适用于后台计算型任务程序: Ps:如果虚拟机完成某个任务...运行垃圾回收时间 ---- 三、老年代回收器 1、Serial Old 收集器 Serial Old 是 Serial 收集器的老年代版本,采用“标记-整理”算法,单线程收集器,也是给 Client 模式下的虚拟机使用

59020

深入理解Java虚拟机》(一)Java虚拟机发展史

Java虚拟机发展史 注:本文大部分摘自《深入理解Java虚拟机(第二版)》 作为一名Java开发人员,不能局限于Java语言规范,更需要对Java虚拟机规范有所了解。...Java虚拟机规范有多种实现,其中HotSpot VM是Oracle JDK和Open JDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。...:号称世界上最快的Java 虚拟机 5.目前最流行的Java 虚拟机: 1....Zing VM 推荐阅读 《深入理解Java虚拟机》(一)Java虚拟机发展史 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略 《深入理解...Java虚拟机》(四)虚拟机性能监控与故障处理工具 《深入理解Java虚拟机》(五)JVM调优 - 工具 《深入理解Java虚拟机》(六)堆内存使用分析,GC 日志解读 Contact 作者:鹏磊 出处

624100

深入理解Java虚拟机-虚拟机执行子系统

阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。...《深入理解Java虚拟机》全书总结如下: 序号 内容 链接地址 1 深入理解Java虚拟机-走近Java https://blog.csdn.net/ThinkWon/article/details/103804387...2 深入理解Java虚拟机-Java内存区域与内存溢出异常 https://blog.csdn.net/ThinkWon/article/details/103827387 3 深入理解Java虚拟机...字节码指令简介 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 公有设计和私有实现 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 Class文件结构的发展 感兴趣的小伙伴可以自行阅读《深入理解...基于栈的解释器执行过程 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机》 类加载及执行子系统的案例与实战 感兴趣的小伙伴可以自行阅读《深入理解Java虚拟机

31920

深入理解Java虚拟机2——对象探秘

深入理解Java虚拟机》第2章读书笔记 本文介绍对象的创建过程,包括如何对内存进行分配和对象中内存的布局,还介绍了如何访问对象。 对象的创建 ?...如何保证并发下线程安全,有两种方案: 对分配内存空间的动作进行同步处理——实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性; 把分配内存的动作按照线程划分在不同的空间之中进行,即每个线程在...Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。...哪个线程要分配内存,就在哪个线程的 TLAB 上分配,只有 TLAB 用完并分配新的 TLAB 时,才需要同步锁定; 虚拟机是否使用 TLAB,可以通过-XX:+/-UseTLAB 参数来设定。...对象的访问 目前有两种主流的访问方式: 句柄访问:Java堆中划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据(Java堆)与类型数据(方法区)各自的具体地址信息

31920

深入理解java虚拟机学习笔记 -- 1

redis作为内存非关系型数据库,是一种key - value 缓存产品,但它同时还支持数据持久化,常常和一些老牌关系型数据库配合使用 下文将作为学习笔记介绍一下 深入理解java虚拟机 Java内存区域与内存溢出异常...运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。...Java虚拟机栈 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。...在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展...Java虚拟机规范中定义的内存区域。

29320

深入理解Java虚拟机》读书笔记

1、虚拟机的类加载机制: 虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。...7、类与类加载器: 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所修要的类。...类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确定其在Java虚拟机中的唯一性。...8、双亲委派模型: 绝大部分Java程序都会使用到以下三种系统提供的类加载器: 1)启动类加载器(BootStrap ClassLoader):在HotSpot虚拟机中这个类加载器由C++语言实现,是虚拟机自身的一部分...它负责将存放在\lib目录中的,并且是虚拟机标识的(仅按照文件名识别,如rt.jar,名称不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。

47220

深入理解Java虚拟机(类文件结构)

直到后来细读了《深入理解 Java 虚拟机》中虚拟机执行子系统的相关内容,才建立了清晰的认知。...语言无关性 Java 虚拟机的设计者在设计之初就考虑并实现了其它语言在 Java 虚拟机上运行的可能性。...所以并不是只有 Java 语言能够跑在 Java 虚拟机上,时至今日诸如 Kotlin、Groovy、Jython、JRuby 等一大批 JVM 语言都能够在 Java 虚拟机上运行。...建议想要深入了解的同学可以自己动手将 Java 类编译成二进制字节码文件,根据文章里介绍的类文件结构逐个字符去对照和实验,有助于加深理解。...关于「类文件结构」我们就介绍到这里,下一篇我们来聊聊「虚拟机的类加载机制」。 参考资料: 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 2 版)》 ----

40810

JVM-深入理解Java虚拟机

1.虚拟机字节码执行引擎 1)物理机和虚拟机的执行引擎区别 物理机:直接建立在处理器、硬件、指令集、操作系统层面上 虚拟机:执行引擎是自己实现的,可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式...部分其他语言不同于Java语言,部分语言是在编译时进行连接的工作,而Java语言中,类的加载和初始化都在程序运行期间完成的。...5)初始化阶段 真正开始执行中定义的Java 程序代码(或称为字节码) 6)类与类加载器 a)判断二个类是否相等条件:二个类来源于同一个Class、同一类加载器; b)启动类加载器(C++)是虚拟机的自身的一部分...,其他的类加载器都是由Java语言实现的,独立于虚拟机外部; c)分类:启动类加载器(JAVA_HOME\lib)、扩展类加载器(JAVA_HOME\lib\ext)、应用程序类加载器(ClassPath...新增字节码指令) d)虚拟机内部改动(内存模型、CMS收集器) 3.Java内存区域 1)内存区域划分 a)方法区、虚拟机栈、本地方法栈、堆、程序计数器、执行引擎、本地库接口、本地方法库 b)线程共享区域

40520

深入理解Java虚拟机(类加载机制)

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。...; 当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先初始化这个类; 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果...类加载器 虚拟机设计团队把类加载阶段中的「通过一个类的全限定名来获取描述此类的二进制字节流」这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。...,这些类加载器都由 Java 来实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。...参考资料: 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 2 版)》 ----

32120
领券