`
kris_feng
  • 浏览: 9556 次
社区版块
存档分类
最新评论

classLoader和内存分析

阅读更多

 

类的初始化和对象实例化
反射机制的目的就是通过类加载获取到字节码文件(运行中的类)的内部数据结构,再对这些获取的信息进行操作,如获取类对象、创建对象实例、获取方法名、调用方法、获取方法参数类型和方法返回类型等。
 
理解反射前要先了解类的加载及JVM内部的存储机制
 
类加载时通过   1.  加载
                   ->2.链接      验证(完全性校验)、准备(为静态数据赋予初始值基本数字数据类型为0,boolea型为false,string为null,对象为null)、解析(将符号引用转化为地址引用,为了能够直接在内存中找到数据)
                   ->3.类初始化   执行静态变量、方法并进行赋值
 
第一个加载过程中:将java文件转换为字节码class文件,在这个转变过程中 将java文件中的信息存到三个区域(堆、栈、方法区)
     方法区(特殊的堆): 存放了类结构模板信息    1.代码块 (类的属性、方法、代码)    2.静态变量      3.常量池   
     堆:        存放了java.lang.class对象,该对象的作用是访问方法区的数据结构从而操作类的信息(反射就是完成这个过程),类的成员变量在对象实例化后通过方法区的数据结构信息存在该区,static成员变量则在类加载初始化后就存在该区了
     栈:        存放  方法地址、局部变量等,
程序运行内存分析:
          比如存在局部变量A a = new A; 过程中在中创建a,通过new创建对象(调用构造器),堆参照方法区中加载类的数据结构创建了A的对象,并且将A对象的地址赋值给了栈中的a(引用),而堆中的这个对象通过引用访问方法区中的数据信息,如给对象赋值某个字符串常量,就是通过A对象中的引用地址访问方法区中的常量池(对象中基本数据类型可直接赋值,无需引用)。如图高琪类加载机制
 
反射的作用
     1).获取字节码文件信息,类名和方法名
     2).获取该类名对应的字节码文件对象
     3).获取指定的方法对象
     4).创建该字节码文件对象
     5).调用方法运行
 
JDK中有多个classLoader,如下:
类加载机制
类加载器classloader:负责将类文件加载到内存
类主要是通过ClassLoader及其子类完成加载的,类的层次关系加载顺序如下
1.检查(自下而上):该过程中只要检查到某个classloader已经存在则认为该类已经加载了,保证此类所有classloader只加载一次
 
    bootstraploader(启动类加载器): 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,加载jdk core中的核心类由C++实现
             |  
    extension classloader(标准扩展类加载器): 负责加载java平台中扩展功能的一些jar包,一般在JDK的目录“Java\jre7\lib\ext”目录下
                                                                        该文件中得了类属于JDK自带引用类,可直接使用,eclipse目录中为JRE Syetem library
             |
    app classloader(系统类加载器):负责加载classpath中指定的包,一般加载为用户自己定义的class,
             |
    other classloader:加载其他类型的class   SecureClassLoader URLClassLoader等 
 
各个classloader之间是用过getParent()方法在内存拿到引用对象的相互关联(非继承关系)。
在加载一个类时会先通过getParent()引用查找上级加载器是否加载过们,如果加载过则当前加载器不再加载
 
String str = "T"
Class c = class.forName(str);                       获取类名为T的类对象               
Object o = c.newInstace();                          为对象创建实例                       //该两句实现了关键字new的加载类、生成实例的作用     
Method[] methods = c.getMethods();               获取类的方法成员
for(Method m:methods){
     if(m.getName().equals("方法名"))                核对 m对象中的方法是否存在
         m.invoke(o);                                          调用该方法
}
二、细节补充
(1)对比:forName和getClassLoader();http://carl-java.iteye.com/blog/978680
class. forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中(即只链接,不做初始化),不会执行static中的内容,只有在newInstance才会去执行static块。
 
(2)对比:new 和 newInstance
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口
分享到:
评论

相关推荐

    浅谈Android Classloader动态加载分析

    ClassLoader概念 我们知道,Java源文件(.java...所以ClassLoader就是用来动态加载class文件到内存当中用的。 ClassLoader的分类 Android中的常用几种类加载器类型继承关系划分可以用一组关系图来表示 BootClassLoder

    Java ClassLoader 原理详细分析

    一、什么是ClassLoader?...而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有clas

    深入分析Java Web技术内幕高清PDF版.zip

    其次深入介绍Java技术,包括I/O技术、中文编码问题、Javac编译原理、class文件结构解析、ClassLoader工作机制及JVM的内存管理等。最后介绍Java服务端技术,主要包括Servlet、Session与Cookie、Tomcat与Jetty服务器、...

    深入JVM内核 - 原理、诊断与优化

    介绍常用的JVM诊断和分析工具,并以死锁和OOM为例,展示这些工具的使用。 第八课 分析Java堆 MAT的使用案例 Jvisualvm介绍使用 介绍了Java堆的分析方法,以一个实例为基础,展示对堆的分析过程。 第九课 锁 ...

    深入分析Java Web技术内幕 修订版.pdf

    其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader 工作机制及JVM 的内存管理等。最后介绍了Java 服务端技术,主要包括Servlet、Session 与Cookie、Tomcat 与...

    深入分析Java Web技术内幕 修订版

    其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader 工作机制及JVM 的内存管理等。最后介绍了Java 服务端技术,主要包括Servlet、Session 与Cookie、Tomcat 与...

    源码分析BlackDex大法,是如何运作的?共三篇

    想要了解如何dump出Dex,就要先了解Dex文件是如何加载进内存的。上文说到Application是通过LoadedApk#makeApplication完成的,那么我们看下相关实现。 本文源码为:android11_r1 系统源码:android.app.LoadedApk#...

    java-homework

    (选做)自己写一个简单的Hello.java,里面需要涉及基本类型,四则运行,如果和为,然后自己分析一下对应的字节码。 2。 (必做)自定义一个Classloader,加载一个Hello.xlass文件,执行hello方法,此文件内容是一...

    java高级工程师、技术专家、架构师、项目经理面试宝典.rar

    注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法 年轻代:是所有新对象产生的地方。 年老代:在年轻代中经历了N次回收后仍然...

    虚拟机实验报告.docx

    3、实现虚拟机与主机通讯(比如在主机和虚拟机之间实现QQ聊天) 4、在虚拟机上运行软件实验(比如安装VideoPack5软件) 实验原理:所有的虚拟机都包括一个内置的类装载器,这个内置的类库装载器被称为根装载器...

    深入分析JavaClassLoader原理

    而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被...

    JavaClassLoader原理详细分析

    而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被...

    基于javatcpsocket通信的拆包和装包源码-someData:存放一些思维导图,图片,ppt等等

    基于java tcp socket通信的拆包和装包源码 ...反射中,Class.forName和ClassLoader区别 动态代理的几种实现方式,对应的优缺点 动态代理与cglib实现的区别 为什么CGlib方式可以对接口实现代理 序列化,

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你也许不知道的几件事.mp4 │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你也许不知道的几件事.mp4 │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机...

    java8rt.jar源码-fwh-JVM:对于JVM情况

    classLoader , Java 准备: Markdown编写工具 有道云笔记 Idea开发工具 GItHub项目地址 分析: 类加载运行全过程: 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。 public...

    超级有影响力霸气的Java面试题大全文档

     ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,...

Global site tag (gtag.js) - Google Analytics