1 内存分析

Java 内存
image.png

类加载与 ClassLoader
image.png
image.png

  1. public class TestMemory {
  2. public static void main(String[] args) {
  3. Dummy dummy = new Dummy();
  4. System.out.println(Dummy.a);
  5. }
  6. }
  7. class Dummy {
  8. static {
  9. System.out.println("Static code block...");
  10. a = 300;
  11. }
  12. static int a = 100;
  13. public Dummy() {
  14. System.out.println("Constructor...");
  15. }
  16. }
  1. Static code block...
  2. Constructor...
  3. 100

由于在类初始化过程中<clinit>()方法将静态代码块和静态变量赋值代码进行了合并,合并之后长这个样:

  1. <clinit>() {
  2. System.out.println("Static code block...");
  3. a = 300;
  4. a = 100;
  5. }

所以输出Dummy.a的值为 100 而不是 300。

2 类初始化过程

image.png

3 类加载器 ClassLoader

image.png
image.png

  1. package com.lht.reflection;
  2. public class TestClassLoader {
  3. public static void main(String[] args) {
  4. // Application classloader.
  5. ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
  6. System.out.println(systemClassLoader);
  7. // Extension classloader.
  8. ClassLoader parent = systemClassLoader.getParent();
  9. System.out.println(parent);
  10. // null
  11. System.out.println(parent.getParent());
  12. }
  13. }

由于最后一层希望获取的是引导类加载器(C++),Java 无法获取,故返回null

  1. // AppClassLoader
  2. System.out.println(Class.forName("com.lht.reflection.TestClassLoader").getClassLoader());
  3. // null
  4. System.out.println(Class.forName("java.lang.Object").getClassLoader());

可以看出,java.lang.Object是系统核心库,由引导类加载器进行加载。