随笔分类 -  JVM学习笔记

摘要:HotSpot是基于c++实现,而c++是一门面向对象的语言,本身是具备面向对象基本特征的,所以Java中的对象表示,最简单的做法是为每个Java类生成一个c++类与之对应。但HotSpot JVM并没有这么做,而是设计了一个OOP-Klass模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。OPP就不在这里描述了,介绍一下位于方法区的Klass模型,加载到方法区的每个类都有一个与之对应的Klass类实例,这里的Klass类并不是Java语言层面的类,而是C++层面。 阅读全文
posted @ 2021-12-24 23:55 哲雪君! 阅读(120) 评论(0) 推荐(0)
摘要:JVM虚拟机规范中虽然在逻辑上将方法区描述为堆区的一部分,但对于HotSpot虚拟机而言,还有一个别名Non-Heap(非堆),目的是与堆区分开。方法也是线程共享的区域,在JVM启动的时候被创建,并且,和堆区一样可以是逻辑上连续,物理上不连续的区域。 阅读全文
posted @ 2021-12-24 23:54 哲雪君! 阅读(134) 评论(0) 推荐(0)
摘要:常量池是字节码文件的一部分,主要存储了编译期间的各种字面量和符号引用(如下代码),这部分内容在类加载后会存放到运行时常量池中,常量池和运行时常量池一一对应。 阅读全文
posted @ 2021-12-24 23:54 哲雪君! 阅读(106) 评论(0) 推荐(0)
摘要:逃逸分析是目前JVM前沿的优化分析技术,基本原理是分析对象的动态作用域,如果对象只能在方法内部被访问到,说明对象没有发生逃逸,反之,说明对象发生逃逸。 阅读全文
posted @ 2021-12-20 23:51 哲雪君! 阅读(103) 评论(0) 推荐(0)
摘要:堆中存对象,栈上存引用,JVM中有两种对象访问定位方式: 阅读全文
posted @ 2021-12-19 22:31 哲雪君! 阅读(110) 评论(0) 推荐(0)
摘要:JVM的垃圾收集并非同时对堆中三个区域(伊甸区、幸存区、老年代)进行收集,大部分时候都是回收年轻代,HotSpot虚拟机将垃圾收集分为部分收集(Partial GC)和整堆收集(Full GC)。 阅读全文
posted @ 2021-12-18 20:27 哲雪君! 阅读(462) 评论(0) 推荐(0)
摘要:堆区(Heap区)是JVM运行时数据区占用内存最大的一块区域,每一个JVM进程只存在一个堆区,它在JVM启动时被创建,JVM规范中规定堆区可以是物理上不连续的内存,但必须是逻辑上连续的内存。 阅读全文
posted @ 2021-12-18 18:35 哲雪君! 阅读(242) 评论(0) 推荐(0)
摘要:在JDK自带的方法库中常常看到被native修饰的方法,这些方法没有方法体实现,它们方法体通常是由C/C++语言实现,这种方法称为本地方法。 阅读全文
posted @ 2021-12-12 19:32 哲雪君! 阅读(124) 评论(0) 推荐(0)
摘要:方法返回地址(return Address)是栈帧的最后一块区域,存放了调用该方法的程序计数器的值。 阅读全文
posted @ 2021-12-01 22:22 哲雪君! 阅读(211) 评论(0) 推荐(0)
摘要:Class文件中存在一个常量池表(Constant Pool Table),存了编译之后各种字面量和符号引用,其中,方法之间的调用也被表示成符号引用,这种符号引用会在虚拟栈方法调用时转为直接引用,方法调用从符号引用转为直接引用就是动态链接(Dynamic Linking)。为了支持动态连接实现,每一个栈帧中都有一个指向运行时常量池中该栈帧所属方法的引用。所以要想理解动态链接,就首先了解虚拟机中是如何进行方法调用。 阅读全文
posted @ 2021-11-22 19:35 哲雪君! 阅读(890) 评论(0) 推荐(0)
摘要:操作数栈(Operand Stack)是栈帧中一个先入后出的栈,同局部变量表一样,栈的最大深度在编译期间就已确定,并在运行期间也不会改变。 阅读全文
posted @ 2021-11-09 21:01 哲雪君! 阅读(409) 评论(0) 推荐(1)
摘要:局部变量表是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量 阅读全文
posted @ 2021-11-02 22:51 哲雪君! 阅读(748) 评论(0) 推荐(1)
摘要:虚拟机栈是线程执行Java程序时,处理Java方法中内容的内存区域 阅读全文
posted @ 2021-10-29 21:25 哲雪君! 阅读(161) 评论(0) 推荐(0)
摘要:程序计数器是线程私有地一块很小的内存区域,几乎忽略不计,同时也是运行速度最快的存储区域,存储了要执行的下一条指令的地址 阅读全文
posted @ 2021-10-27 20:23 哲雪君! 阅读(181) 评论(0) 推荐(0)
摘要:Java程序对类的使用分为主动使用和被动使用,主动使用时,会触发类的初始化(在JVM虚拟机规范中,对于类在什么时候加载并没有做限定,但是对类的初始化时机有规定),而被动使用则不会。 阅读全文
posted @ 2021-10-17 19:45 哲雪君! 阅读(106) 评论(0) 推荐(0)
摘要:JVM对class文件是按需加载,在加载class的过程,如果当前类加载器存在父类加载器,都会将加载请求先委派给父类加载器,这种任务委派方式被称为双亲委派。 阅读全文
posted @ 2021-10-16 18:53 哲雪君! 阅读(137) 评论(0) 推荐(0)
摘要:在类加载过程的加载阶段,有一个通过类的全限定名获取描述类的二进制流的动作,Java虚拟机设计团队有意将这个动作的实现放到虚拟机之外实现,以便让用户自己决定如何获取所需类,这个动作的实现被称为类加载器。 阅读全文
posted @ 2021-10-15 15:56 哲雪君! 阅读(143) 评论(0) 推荐(0)
摘要:在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程 阅读全文
posted @ 2021-10-14 18:34 哲雪君! 阅读(118) 评论(0) 推荐(0)