Java内存分区
存放new的对象和数组
new出来的对象会放在这里
可以被所有的线程共享,不会存放别的对象引用
存放基本变量类型(包含这个基本类型的具体值)
对象里面有属性啊!这个属性就放在这里
引用对象的变量(会存放这个引用在堆里面的具体地址)
栈不直接存放对象,但是会存怎么找对象(对象地址)
这其实是一种特殊的堆
可以被所有线程共享
包含了所有的class和static、常量、代码
类的加载(Load)
将类的class文件对入内存,并为之创建一个java.lang.Class对象
类的链接(Link)
将类的二进制数据合并到JRE(java运行环境)中
类的初始化(Initialize)
JVM负责对类进行初始化
首先将class这个一个字节码文件加载到内存中,
第二将这些字节码静态数据转换成方法区的运行时数据结构,
最后生成一个代表这个类的java.lang.Class对象
注:Class中 ‘C’ 是大写的,这java反射机制的核心
扩展知识:类缓存,一旦某个类被加载到类加载器中,它将维持一段时间。可以通过JVM垃圾回收机制回收这些Class对象
注:初始化是通过类构造函数来生成的
执行类构造器
类构造器
类构造器是构造类信息的,不是构造该类对象的构造函数
static方法会在此时合并为
如果父类没有初始化,先初始化其父类
虚拟机会保证一个类的
访问一个静态域时,只有真正声明这个域的类才会被初始化
例如:当通过子类引用父类的静态变量,子类不会初始化
因为链接过程中就加载过static了,所有不会进行到第三步初始化
通过数组定义类引用,不会触发此类的初始化
引用常量不会触发此类的初始化(常量也是在链接阶段就存入调用类的常量池中了)
//获取系统加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));
原文:https://www.cnblogs.com/zhoushuaiyi/p/14592263.html