IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 类加载内存分析(Java) -> 正文阅读

[Java知识库]类加载内存分析(Java)

Java内存

    • 存放new对象和数组

    • 可以被所有线程共享,不会存放别的对象的引用

    • 存放基本变量类型(会包含这个基本类型的具体数值)

    • 引用对象的变量(会存放引用在堆中的具体地址)

  • 方法区

    • 可以被所有线程共享

    • 包含了所有的class和static变量

类的加载过程

当程序主动使用某个类时,如果该类还没有加载到内存中,此时系统会通过三个步骤来对该类进行初始化:

类的加载 ---> 类的链接 ---> 类的初始化

类的加载(Load) : 将类的文件读取到内存中,并创建一个java.lanf.Class对象,这个过程是由类加载器完成的。

类的链接(Link) : 将类的二进制文件数据合并到 JRE (Java Runtime Environment) 中。

类的初始化(Initialize):JVM(Java Virtual Machine)对类进行初始化。

详细说明

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

  • 链接:将Java类的二进制代码合并到 JVM 的运行状态之中的过程。

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

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

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

  • 初始化:

    • JVM(Java Virtual Machine)会执行类构造器中<clinit>( )方法。类构造器<clinit>( )方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类的构造器是初始类的信息,并不是构造该类对象的构造器)

    • 当初始化一个类的时候,如果发现该类有父类,并且该类的父类还没有进行初始化,需要先触发对其父类的初始化。

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

package Learning;

public class Test {
    public static void main(String[] args) {
        Loading loading = new Loading();
        System.out.println(loading.i);
    }
}

class Loading{
    static int i = 1;
    static {
        System.out.println("静态代码块 - Loading");
        i = 2;
    }
    public Loading(){
        System.out.println("无参构造 - Loading");
    }
}

测试结果:

静态代码块 - Loading
无参构造 - Loading
2

?过程分析

图示:

?Test类写好后,会编译成Class文件,加载类的信息到内存中

类有哪些信息?

  • Test类的数据:1. 静态变量 2. 静态方法 3. 常量池 4.代码 ...

  • Loading类的数据:1. 静态变量 2. 静态方法 3. 常量池 4.代码 ...

加载这些信息的时会在堆中生成 Java.lang.Class对象也就是类对应的Class对象,每个类只有唯一一个Class对象!

加载完这些信息后,程序就会执行main( )方法,并且这时候将静态变量 i 初始化为 0(链接阶段)

然后会在堆中进行new Loading( )操作,产生Loading类的对象,Loading类的对象会指向方法区中 Loading类中的数据,Loading类的对象会去找Loading类对应的唯一的Class对象,从Loading类对应的唯一的Class对象中得到数据,通过得到的这些数据,开始给Loading类显式赋值,最后开始初始化,Loading类调用了一个方法,这个方法是<clinit>( )方法:

<clinit>(){
      i = 1; 
      System.out.out.println("静态代码块 - Loading");
      i = 2;
}

将静态代码块中的初始值都合并起来,由于静态代码块是按照顺序执行,i 的值被覆盖,最后结果是 i = 2。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:25:07  更:2021-08-22 13:25:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 21:40:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码