﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-虚幻世界-文章分类-JVM理解</title><link>http://www.blogjava.net/robot86736711/category/51228.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 04 Apr 2012 18:35:46 GMT</lastBuildDate><pubDate>Wed, 04 Apr 2012 18:35:46 GMT</pubDate><ttl>60</ttl><item><title>类加载机制</title><link>http://www.blogjava.net/robot86736711/articles/372657.html</link><dc:creator>海峰</dc:creator><author>海峰</author><pubDate>Tue, 27 Mar 2012 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/robot86736711/articles/372657.html</guid><wfw:comment>http://www.blogjava.net/robot86736711/comments/372657.html</wfw:comment><comments>http://www.blogjava.net/robot86736711/articles/372657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robot86736711/comments/commentRss/372657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robot86736711/services/trackbacks/372657.html</trackback:ping><description><![CDATA[<p>类加载机制<br />&nbsp;&nbsp;&nbsp;&nbsp;叙述：类加载机制就是将.class文件加载到JVM，并形成class对象的机制。之后就可以对其实例化并使用，这个机制可以动态的加载外部的类、远程下载的class文件，并且可以做到类之间的隔离。<br />&nbsp;&nbsp;&nbsp;&nbsp;步骤：JVM加载的步骤：装载、链接、初始化。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;装载：将class文件中的字节码加载到JVM，并通过全名（org.test.Test）和类加载器（ClassLoader）来加载到JVM中。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;链接：负责对装载的二进制字节码的格式进行检验，初始化类中的静态标量并检查类中调用的接口、类。最后对所有的属性、方法进行检验。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始化：初始化是执行静态初始化代码、构造器代码和静态属性的初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出发的方式：1.new 2.反射 3.子类调用初始化 4.JVM启动参数中的类<br />ClassLoader：有4种ClassLoader负责加载类。<br />&nbsp;&nbsp;&nbsp;&nbsp;1.Bootstrap ClassLoader<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由C++实现的，来加载jre/lib/rt.jar、resources.jar等。在java中无法拿到此对象。<br />&nbsp;&nbsp;&nbsp;&nbsp;2.Extension ClassLoader<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来加载java扩展包，jre/lib/ext/*.jar。<br />&nbsp;&nbsp;&nbsp;&nbsp;3.System ClassLoader<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用来加载参数中的指定的classpath的jar，在类中显示对应的是AppClassLoader。<br />&nbsp;&nbsp;&nbsp;&nbsp;4.User-Defined ClassLoad<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是java开发人员继承ClassLoader抽象类自行实现的ClassLoader，可以加载非classpath中的类（网络下载的java、class），还可以在加载之前做一些事情。<br /><br />加载顺序：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先要说明一个误区，这个误区是经常理解有问题的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classloader加载的只是class（类），不要认为它加载的是对象，这样你就会很是理解不了classloader加载顺序。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classloader的顺序是先父后子（这里因为Bootstrap ClassLoader在java中拿不到，所以他是最先完成加载的）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已委托的方式循序加载<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：User-Defined ClassLoad有个一类要加载则先会去委托System ClassLoader加载依此类推，每个节点都会委托父节点去加载，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果父节点没有加载到自己再去加载，如果父节点加载了将吧加载的引用返回给自己。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;两个java类相同的条件不尽需要同样的包名和class而且加载器也必须相同，这样的类才算是统一各类。比如有classloaderA和classloaderB，都加在了<br />Test类，两次别加载的类是不一样的。这也体现出了隔离性。<br /><br /></p><img src ="http://www.blogjava.net/robot86736711/aggbug/372657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robot86736711/" target="_blank">海峰</a> 2012-03-27 15:16 <a href="http://www.blogjava.net/robot86736711/articles/372657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>