作者:empty 出版社:empty |
ClassLoader是JVM级别的, 由C++实现, 不是ClassLoader的子类, 开发者也无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。2.Extension ClassLoader负责加载java平台中扩展功能的一些jar包, 主要是由sun.misc.Launcher$Ext ClassLoader实现的, 是一个java类, 继承自URL ClassLoader超类。它将负责%JRE_HOME lib/ext目录下的jar和class加栽到内存, 开发者可以直接使用该加载器。
3.App ClassLoader负责加栽环境变量classpath中指定的jar包及目录中class到内存中, 开发者也可以直接使用系统类加栽器。4.Custom ClassLoader属于应用程序根据自身需要自定义的ClassLoader(一般为java.lang.ClassLoader的子类) 在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性, 如tomcat、jboss都会根据j2ee规范自行实现ClassLoader。自定义ClassLoader在某些应用场景还是比较适用, 特别是需要灵活地动态加载class的时候。
这张图是我见过的最能描述JVM内存模型的图, JVM包括两个子系统和两个组件。两个子系统为:classloader(类装载) 、Executionengine(执行引擎) ; 两个组件为:Runt medata area(运行时数据区) 、Native interface(本地接)Classloader功能:根据给定的全限定名类名(如:java.lang.Object) 来装载class文件到Runtime data area中的method area。程序中可以extends java.lang.ClassLoader类来实现自己的Classloader。Executionengine功能:执行classes中的指令。任何JVM specification实现(JDK) 的核心都是Executionengine, 不同的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Executionengine的好坏。Native interface组件:与native libraries交互, 是其它编程语言交互的接。当调用native方法的时候, 就进入了一个全新的并且不再受虚拟机限制的世界, 所以也很容易出現JVM无法控制的native heap OutOfMemory-Runtime Data Area组件:这就是我们常说的JVM的内存。主要分为五个部分:1、Heap(堆) :一个Java虚拟实例中只存在一个堆空间2、Method Area(方法区域) :被装载的class的信息存储在Method area的内存中。当虚拟机装栽某个类型时, 它使用类装栽器定位相应的class文件, 然后读入这个class文件内容并把它传输到虚拟机中。3、Java Stack(java的栈) :虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈4、ProgramCounter(程序计数器) :每一个线程都有它自己的PC寄存器, 也是该线程启动时创建的。PC内存模型寄存器的内容总是指向下一条将被执行指合的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。5、Naive method stack(本地方法栈) :保存native方法进入区域的地址以上五部分只有Heap和Method Area是被所有线程的共享使用的; 而Java stack, Programcounter和Native method stack是以线程为粒度的, 每个线程独自拥有自己的部分。(转栽本站文章清注明作者和出处Java Ranger-java ranger com, 请勿用于任何商业用途)