![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
菜到怀疑人生
这个作者很懒,什么都没留下…
展开
-
JVM中的常量池的GC
位于常量池中的常量也可以被GC,常量GC的条件和实例对象类似,当没有一个引用指向该常量时,此时若发生内存回收,则可能被GC,常量池中的类或接口、方法、字段的符号引用也是如此原创 2018-01-31 09:21:35 · 1670 阅读 · 1 评论 -
JVM的字节码指令
先来看看什么是字节码指令上图的Code区域即为字节码指令。JVM的指令是由一个字节长度的、代表某种操作的数字(例如iconst_0,iconst_0前面的数据表示语句的顺序,可用于条件判断语句)以及跟在其后的0到多个操作数(或是操作数的索引)构成的(上图指令没有操作数),大多数指令都包含了其操作所对应的数据类型的信息,例如iload指令将int型数据从局部变量表加载到操作数栈中,由于JVM指令只有...原创 2018-01-18 09:15:28 · 834 阅读 · 1 评论 -
Class文件中的常量池详解(上)
NO1.常量池在class文件的什么位置? 我的上一篇文章《Java虚拟机原理图解》 1、class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 知道了常量池的位置后,然后让我们来揭秘常量池里究竟有什么东西吧~转载 2018-01-31 09:26:25 · 935 阅读 · 3 评论 -
Class文件中的常量池详解(下)
附上上一篇转载的博客地址:Class文件中的常量池详解(上)NO9.类中引用到的field字段在常量池中是怎样描述的?(CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言,我们在定义类的过程中会定义一些 field 字段,然后会在这个类的其他地方(如方法中)使用到它。有可能我们在类的方法中只使用field字段一次,也有转载 2018-01-31 09:28:27 · 482 阅读 · 0 评论 -
JVM类的加载
类加载的过程:加载、验证、准备、解析、初始化、使用、卸载,其中加载、验证、准备、初始化按顺序开始,但不需要等前一阶段完成后才开始,解析状态可以发生在初始化前也可以发生在初始化后。当类完成加载、验证、准备、解析后,才可以真正的被JVM执行。 以下的类变量均指静态变量 加载:jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则不会再去加载过程:通过...原创 2018-01-18 16:24:32 · 298 阅读 · 0 评论 -
JVM的垃圾回收算法和堆的GC
之前说过JVM堆内存的划分与垃圾回收机制有关,现在来填坑,堆内存结构如下。怎样的对象才需要被回收?java课上老师是这么说的,当某个内存没有引用指向时,该内存就会被释放,那么如何判断一个内存是否有引用指向呢?sun的JVM采用根搜索方法,以一系列名为“GC Root”的对象为起点,从这些节点往下搜索,搜索走过的路径称为引用链,若一个内存没有和任何引用链相连,则被回收,需要GC的只有方法原创 2018-01-17 11:05:35 · 150 阅读 · 0 评论 -
JVM的内存结构
整个JVM的内存区域包括方法区、本地方法栈、虚拟机栈、堆、程序计数器。 其中程序计数器与虚拟机栈为线程私有: 程序计数器:用来记录当前JVM执行字节码的地址,之所以为线程私有是因为Java的多线程会有线程的切换,假如A线程在执行过程中失去对资源的支配权,此刻A线程的执行状态就保存在程序计数器中,以便重新获得资源支配权时能继续之前的工作,如果线程正在执行一个java方法,则计原创 2018-01-16 22:58:18 · 161 阅读 · 0 评论 -
常量在什么时候被放入常量池?
先来了解一下常量池,常量池分为方法区中的运行时常量池和class文件中的常量池,class文件中的常量池在编译时确定,其中包括符号引用和字面量(文本字符串,被声明为final的变量的值),运行时,JVM从中读取数据到方法区的运行时常量池,运行时常量池可以在运行时添加常量,常量可以在运行时或编译时被放入常量池,编译期放入到类文件的常量池中,运行时放入到方法区的运行时常量池中,JDK1.7后运行时常量原创 2018-01-30 16:57:13 · 4235 阅读 · 6 评论 -
简单说说<init>和<clinit>
<clinit>:在初始化时执行,从上到下的收集有初始值的静态成员域或static块的值,进行赋值,执行本类的<clinit>函数时,父类的<clinit>函数已经执行完毕,若本类不具有静态成员域或static块,则JVM不会为该类产生<clinit>函数。<init>:其实就是构造函数,在生成class文件时,编译器会在构造函数中添加一...原创 2018-01-28 10:31:55 · 1933 阅读 · 0 评论