1 Java内存分析

2 了解:类的加载过程

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

3 类的加载与ClassLoader的理解

4 什么时候会发生类初始化?

  • 类的主动引用(一定会发生类的初始化)

    • 当虚拟机启动,先初始化main方法所在的类
    • new一个类的对象
    • 调用类的静态成员(除了final常量)和静态方法
    • 使用 java.lang.reflect 包的方法对类进行反射调用
    • 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类
  • 类的被动引用(不会发生类的初始化)
    • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
    • 通过数组定义类引用,不会触发此类的初始化
    • 引用常量不会触发此类的初始化(常量在链接阶段就存入了调用类的常量池中了)

4.1 代码演示

(1)创建 父类、子类

class Father{static int b = 3;static {System.out.println("父类被加载");}
}class Son extends Father{static {System.out.println("子类被加载");m = 200;}static int m = 100;static final int M = 10;
}

(2)测试

package com.annotation;public class Test5 {static {System.out.println("Main被加载");}public static void main(String[] args) throws ClassNotFoundException {//1. 主动引用//Son son = new Son();/*Main被加载父类被加载子类被加载*/// 2.反射也会产生主动引用//Class.forName("com.annotation.Son");/*Main被加载父类被加载子类被加载*///System.out.println(Son.m);/*Main被加载父类被加载子类被加载100*/// 不会产生类的引用的方法//System.out.println(Son.b);/*Main被加载父类被加载3*///Son[] array = new Son[5];/*Main被加载*/System.out.println(Son.M);/*Main被加载10*/}
}

5 类加载器

  • 类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。
  • 类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些Class对象。

5.1 类加载器的作用

用来把类(class)装载进内存的。JVM规范定义了如下类型的类的加载器。

5.2 代码演示

package com.annotation;public class Test6 {public static void main(String[] args) throws ClassNotFoundException {// 获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);// 获取系统类加载器的父类加载器 -> 扩展类加载器ClassLoader parent = systemClassLoader.getParent();System.out.println(parent);// 获取扩展类加载器的父类加载器 -> 根加载器(C/C++)ClassLoader parent1 = parent.getParent();System.out.println(parent1);// 测试当前类时哪个加载器加载的ClassLoader classLoader = Class.forName("com.annotation.Test6").getClassLoader();System.out.println(classLoader);// 测试JDK内置的类是谁加载的classLoader = Class.forName("java.lang.Object").getClassLoader();System.out.println(classLoader);// 如何获得系统类加载器可以加载的路径System.out.println(System.getProperty("java.class.path"));}
}/*
运行结果:
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
jdk.internal.loader.ClassLoaders$PlatformClassLoader@3b07d329
null
jdk.internal.loader.ClassLoaders$AppClassLoader@63947c6b
null
D:\JavaIdeaProjects\注解与反射\target\classes;D:\apache-maven-3.8.5\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar
*/

3 Java类的内存分析相关推荐

  1. Java类加载过程内存分析

    Java类加载过程内存分析 Java类加载过程 编译 类的加载 类加载器 运行时数据区 执行引擎 Java类加载过程 具体过程如下: 编译 首先Java源代码会被编译器编译成class文件以供计算机执 ...

  2. java visualvm 内存_【Java线程与内存分析工具】VisualVM与MAT简明教程

    前言 本文将简要介绍Java线程与内存分析工具VisualVM和MAT的使用,进一步的学习可参考官网或工具帮助(例如MAT:Help -> Welcome -> Tutorials),并在 ...

  3. Java中的内存分析

    分析内存是深入了解编程的第一步,以下来演示一下编程中常见的内存分析,文章脉络: 数据类型 数据类型不同,内存分配位置和大小也不同,用一张图表示Java中的数据类型.除了基本数据类型,其它全部是引用类型 ...

  4. java jmap_Java进程内存分析工具之jmap

    jmap是java 7后自带的轻量级内存分析工具,原文介绍可以见官网,<The jmap Utility> 1 堆栈分析 获取GC算法,新生代,老年代,永久代空间占用分析 jmap -he ...

  5. java堆外内存泄漏分析排查

    JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1.前言 2.准备 3.具体分析 3.1堆外溢出风险判断 3.1.1确认java进程号 3.1.2查看此java进程的jvm参数 3.1.3查看j ...

  6. 面试积累(java的内存分析)

    关于java中的内存分析: 1 首先,java中的内存总体分为了四个部分,分别为stack segment,heap segment,code segment,data segment.即 栈区,堆区 ...

  7. java面向对象的全面分析

    由于文章可能过长,看自己需要的部分即可-我尽量把java面向对象讲得全面一点,尽量让有一点点Java学习基础的同学也能看得懂,了解的深度也足够. 若在文章中发现了什么问题或者不太理解的地方-请及时评论 ...

  8. Java内存分析1 - 从两个程序说起

    这次看一些关于JVM内存分析的内容. 两个程序 程序一 首先来看两个程序,这里是程序一:JVMStackTest,看下代码: package com.zhyea.robin.jvm;public cl ...

  9. java 基本类型内存_java基本数据类型、内存分析、装包拆包

    2019-09-13   18:01:23 idea快捷键: file->settings->Keymap->搜索关键字 Increase Font Size   增大字体    c ...

最新文章

  1. 算法----返回Excel相应的列序号
  2. TCP流嗅探和连接跟踪工具tcpick
  3. 如何关闭一切流氓程序开机自启【gitter、vmware等】
  4. python notebook使用,Jupyter Notebook使用笔记
  5. 在ASP.net 中对GridView中数据的删除、编辑等操作:
  6. Java 8流:Micro Katas
  7. 华为大数求和 java_大数乘积java
  8. python内置模块大全_python知识汇总(异常、内置模块和打包)
  9. python repusts模块_Python tslearn包_程序模块 - PyPI - Python中文网
  10. 老大让我整理下公司内部mysql使用规范,分享给大家
  11. 对软件开发人员的几个阶段思考和总结
  12. 软件开发管理:管开发如治军
  13. 解压版tomcat7配置
  14. Qt、C++汽车客运公司售票系统
  15. 计算机硕士工资一览表 (时间有点久远了)
  16. 综合使用公网/专网等频段!今日,工信部发布工业互联网和物联网无线电频率使用指南(附下载)...
  17. 如果你用过这些电子产品 证明你老了
  18. 如何重命名mysql数据库_如何重命名MySQL数据库?
  19. 用SurfaceView绘制正弦曲线
  20. 大数据概述:大数据生态系统

热门文章

  1. 太厉害了:雄霸美国的黑市拳王,竟然是中国人!
  2. Ueeshop:一个移动网站,七大对策,提高转化你值得拥有!
  3. 深度学习模型压缩(量化、剪枝、轻量化结构、batch-normalization融合)
  4. 发那科机器人点位编辑_【发那科】发那科机器人位置信息修改的条件和方式
  5. 深度剖析-企业微信和个人微信的7个区别
  6. springboot向手机发送验证码
  7. 电脑文件夹上出现蓝色问号的解决方法
  8. uva11121- -2进制
  9. 箭头函数esLint的语法检测Unexpected block statement surrounding arrow body
  10. excel统计出现次数