首页 > 编程语言 > 详细

java内存、类在内存中的加载

时间:2021-03-29 15:26:10      阅读:18      评论:0      收藏:0      [点我收藏+]

1. Java内存

Java内存分区

  1. 方法区

  1. 存放new的对象和数组

    new出来的对象会放在这里

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

  1. 存放基本变量类型(包含这个基本类型的具体值)

    对象里面有属性啊!这个属性就放在这里

  2. 引用对象的变量(会存放这个引用在堆里面的具体地址)

    栈不直接存放对象,但是会存怎么找对象(对象地址)

方法区

这其实是一种特殊的堆

  1. 可以被所有线程共享

  2. 包含了所有的class和static、常量、代码

2. 类是怎么被加载到内存的

  1. 类的加载(Load)

    将类的class文件对入内存,并为之创建一个java.lang.Class对象

  2. 类的链接(Link)

    将类的二进制数据合并到JRE(java运行环境)中

  3. 类的初始化(Initialize)

    JVM负责对类进行初始化

加载过程详解

  • 首先将class这个一个字节码文件加载到内存中,

  • 第二将这些字节码静态数据转换成方法区的运行时数据结构,

  • 最后生成一个代表这个类的java.lang.Class对象

注:Class中 ‘C’ 是大写的,这java反射机制的核心

扩展知识:类缓存,一旦某个类被加载到类加载器中,它将维持一段时间。可以通过JVM垃圾回收机制回收这些Class对象

链接过程详解

  1. 验证:确保加载的类信息符合JVM规范,没有安全方面的问题
  2. 准备:正式为类变量(static就是这时生成的)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配
  3. 解析:虚拟机常量池的符号引用(常量名)替换为直接引用(地址)的过程

初始化详解

注:初始化是通过类构造函数来生成的

  1. 执行类构造器()方法的过程。

    类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。

    类构造器是构造类信息的,不是构造该类对象的构造函数

    static方法会在此时合并为()方法 *

  2. 如果父类没有初始化,先初始化其父类

  3. 虚拟机会保证一个类的()方法在多线程环境下呗正确的加锁和同步

3. 类的被动引用(不会发生类的初始化)

  1. 访问一个静态域时,只有真正声明这个域的类才会被初始化

    例如:当通过子类引用父类的静态变量,子类不会初始化

    因为链接过程中就加载过static了,所有不会进行到第三步初始化

  2. 通过数组定义类引用,不会触发此类的初始化

  3. 引用常量不会触发此类的初始化(常量也是在链接阶段就存入调用类的常量池中了)

//获取系统加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));

java内存、类在内存中的加载

原文:https://www.cnblogs.com/zhoushuaiyi/p/14592263.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!