目录
【JVM学习笔记】对象的创建过程、 对象的内存布局、 如何定位和使用对象
【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明
HotSpot VM垃圾收集器——Serial Parallel CMS G1垃圾收集器的JVM参数、使用说明、GC分析
【JVM基础内容速查表】JVM基础知识 默认参数 GC命令 工具使用 JVM参数设置、说明、使用方法、注意事项等
前言
JVM内存结构大致了解了,这一部分主要学习JVM将如何载入指定对象,对象又是以什么形式存在于JVM中,最后JVM是如何调用位于堆内存的对象的。
对象的创建过程
1. 确定对象的类型
解析class文件时,当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
符号引用扩展(可以跳过):
符号引用属于编译原理方面的概念,主要包括下面几类常量:
- 被模块导出或者开放的包(Package)
- 类和接口的全限定名(Fully Qualified Name)
- 字段的名称和描述符(Descriptor)
- 方法的名称和描述符
- 方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)
- 动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)
关于符号引用,可以用一种直观的方式查阅。我们可以通过jdk自带命令查看class源文件:
javap -c ClientApplication
编译后的class源文件:
// ClientApplication.class
public class ClientApplication {
public ClientApplication() {
}
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
查看类文件的字节码:
Compiled from "ClientApplication.java"
public class com.example.client.ClientApplication {
public com.example.client.ClientApplication();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // class com/example/client/ClientApplication
2: aload_0
3: invokestatic #3 // Method org/springframework/boot/SpringApplication.run:(Ljava/lang/Class;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableAppl
icationContext;
6: pop
7: return
}
上面“//”后的就是符号引用,他们可以在JVM中完整的唯一的代表某个类、方法等。
2. 确定对象内存大小
在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。
一个A.class,可以根据成员变量来确定类型占用的空间:每个基本类型有固定的大小,数组有长度限制,其它对象基本都是由基本类型和数组组成的。
比如String类,它有一

630

被折叠的 条评论
为什么被折叠?



