3 Java类的内存分析
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类的内存分析相关推荐
- Java类加载过程内存分析
Java类加载过程内存分析 Java类加载过程 编译 类的加载 类加载器 运行时数据区 执行引擎 Java类加载过程 具体过程如下: 编译 首先Java源代码会被编译器编译成class文件以供计算机执 ...
- java visualvm 内存_【Java线程与内存分析工具】VisualVM与MAT简明教程
前言 本文将简要介绍Java线程与内存分析工具VisualVM和MAT的使用,进一步的学习可参考官网或工具帮助(例如MAT:Help -> Welcome -> Tutorials),并在 ...
- Java中的内存分析
分析内存是深入了解编程的第一步,以下来演示一下编程中常见的内存分析,文章脉络: 数据类型 数据类型不同,内存分配位置和大小也不同,用一张图表示Java中的数据类型.除了基本数据类型,其它全部是引用类型 ...
- java jmap_Java进程内存分析工具之jmap
jmap是java 7后自带的轻量级内存分析工具,原文介绍可以见官网,<The jmap Utility> 1 堆栈分析 获取GC算法,新生代,老年代,永久代空间占用分析 jmap -he ...
- java堆外内存泄漏分析排查
JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1.前言 2.准备 3.具体分析 3.1堆外溢出风险判断 3.1.1确认java进程号 3.1.2查看此java进程的jvm参数 3.1.3查看j ...
- 面试积累(java的内存分析)
关于java中的内存分析: 1 首先,java中的内存总体分为了四个部分,分别为stack segment,heap segment,code segment,data segment.即 栈区,堆区 ...
- java面向对象的全面分析
由于文章可能过长,看自己需要的部分即可-我尽量把java面向对象讲得全面一点,尽量让有一点点Java学习基础的同学也能看得懂,了解的深度也足够. 若在文章中发现了什么问题或者不太理解的地方-请及时评论 ...
- Java内存分析1 - 从两个程序说起
这次看一些关于JVM内存分析的内容. 两个程序 程序一 首先来看两个程序,这里是程序一:JVMStackTest,看下代码: package com.zhyea.robin.jvm;public cl ...
- java 基本类型内存_java基本数据类型、内存分析、装包拆包
2019-09-13 18:01:23 idea快捷键: file->settings->Keymap->搜索关键字 Increase Font Size 增大字体 c ...
最新文章
- 算法----返回Excel相应的列序号
- TCP流嗅探和连接跟踪工具tcpick
- 如何关闭一切流氓程序开机自启【gitter、vmware等】
- python notebook使用,Jupyter Notebook使用笔记
- 在ASP.net 中对GridView中数据的删除、编辑等操作:
- Java 8流:Micro Katas
- 华为大数求和 java_大数乘积java
- python内置模块大全_python知识汇总(异常、内置模块和打包)
- python repusts模块_Python tslearn包_程序模块 - PyPI - Python中文网
- 老大让我整理下公司内部mysql使用规范,分享给大家
- 对软件开发人员的几个阶段思考和总结
- 软件开发管理:管开发如治军
- 解压版tomcat7配置
- Qt、C++汽车客运公司售票系统
- 计算机硕士工资一览表 (时间有点久远了)
- 综合使用公网/专网等频段!今日,工信部发布工业互联网和物联网无线电频率使用指南(附下载)...
- 如果你用过这些电子产品 证明你老了
- 如何重命名mysql数据库_如何重命名MySQL数据库?
- 用SurfaceView绘制正弦曲线
- 大数据概述:大数据生态系统