一、类的加载、连接和初始化
1、加载:查找并加载类的二进制数据到JVM
2、连接:
验证:保证被加载类的正确性
准备:给类的静态变量分配内存空间,赋值一个默认的初始值
解析:把类中的符号引用转换为直接引用
在把java编译为class文件时,虚拟机并不知道所引用的地址:助记符:符号引用转为真正的直接引用,找到对应的直接地址
3、初始化:给类的静态变量赋值
注意:Final常量
1、常量的值在编译时期可以确定的,则会将常量放进方法调用者的常量池里面,例如:public static final String str="Hello,parent";
2、常量的值在非编译期间确定的,那么这个常量就不会放进方法调用者的常量池里面,
例如:public static final String str =UUID.randomUUID().toString();
二、ClassLoader
1、java虚拟机自带的加载器
BootStrap ClassLoader 根加载器(加载系统的包,JDK核心库,rt.jar) 由C++实现
Ext ClassLoader 扩展类加载器(加载一些扩展jar包中的类)
App/Sys ClassLoader 应用(系统)加载器,(我们自己编写的java类)
2、用户自定义的加载器
ClassLoader:只需要继承这个抽象类来定义自己的类加载器
3、双亲委派机制
加载顺序:先让BootStrap去加载,如果BootStrap不能加载,则交给Ext去加载,如果Ext不能加载,才由AppClassLoader加载
好处:可以保护java的核心类不会被自己定义的类替代
三、Native:
1、本地方法,只要带了这个关键字,说明Java的作用范围达不到
2、JNI:Java Native Interface:java本地方法接口
四、程序计数器
1、每个线程都有一个程序计数器,是线程私有的
2、程序计数器就是一块十分小的内存空间(基本可以忽略不计),作用可以看作是字节码的执行的行号指示器
五、方法区(Method Area)
1、方法区是Java虚拟机规范中定义的运行时数据区域之一,和堆(heap)一样可以在线程之间共享
2、JDK1.7之前
永久代:用于存储一些虚拟机加载类信息,常量,字符串、静态变量等等。。。。这些东西都会放到永久代中;
永久代大小空间是有限的:如果满了 OutOfMemoryError:PermGen
3、JDK1.8之后
彻底将永久代移除 HotSpot jvm ,Java Heap 中或者 Metaspcace(Native Heap)元空间;
元空间就是方法区在 HotSpot jvm 的实现;
方法区重要就是来存:类信息,常量,字符串、静态变量、符号引用、方法代码。。。。。。
元空间和永久代,都是对JVM规范中方法区的实现。
元空间和永久代最大的区别:==元空间并不在Java虚拟机中,使用的是本地内存!==
-XX:MetasapceSize10m