zoukankan      html  css  js  c++  java
  • 反射(类加载内存分析)

    java内存图:

     类的加载过程:

    加载

       将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象

    链接

       将java类的二进制代码合并到JVM的运行状态之中的过程

        1)验证:确保加载的类信息符合JVM规范,没有安全方面的问题

        2)准备:正式为类变量(static)分配内存并设置默认初始值的阶段,这些内存都将在方法区中进行分配。

        3)解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程

    初始化:


    1)执行类构造器<clinit>()方法的过程,类构造器<clinit>()方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。

    2)当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化

    3)虚拟机会保证一个类<clinit>()方法在多线程环境中被正确加锁和同步

    代码测试:

     1 package reflection;
     2 
     3 import org.w3c.dom.ls.LSOutput;
     4 
     5 public class test05 {
     6     public static void main(String[] args) {
     7 
     8         A a = new A();
     9         System.out.println(A.m);
    10 
    11 
    12         /*
    13         * 1)加载到内存,会产生一个对应Class对象
    14         * 2)链接,链接结束后m=0
    15         * 3)初始化
    16         *   <clinit>() {
    17         *       System.out.println("A类静态代码块初始化");
    18                 m = 300;
    19         *       m = 100;
    20         *    }
    21         *
    22         *    m = 100;
    23         *
    24         * */
    25 
    26     }
    27 
    28 
    29 }
    30 
    31 class A {
    32 
    33     static {
    34         System.out.println("A类静态代码块初始化");
    35         m = 300;
    36     }
    37     static int m = 100;
    38 
    39     public A() {
    40         System.out.println("A类的无参构造初始化");
    41     }
    42 }

    分析:

     重要理解Class这个类是在什么时候产生的。

  • 相关阅读:
    查找数据库表中重复的 Image 类型值
    C#中的引用传递和值传递。
    用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
    根据业务自己设计的.NET工厂模式架构
    封装EF code first用存储过程的分页方法
    2013款MacBook Air装Windows7单系统
    js判断是否在微信浏览器中打开
    EF Code First连接现有数据库
    JS中for循序中延迟加载实现动态效果
    DIV+CSS左右两列自适应高度的方法
  • 原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14645220.html
Copyright © 2011-2022 走看看