java
来源:互联网 发布:geogebra mac 编辑:程序博客网 时间:2024/06/03 18:12
<!DOCTYPE html><html> <head> <link rel="canonical" href="http://blog.csdn.net/zhangliangzi/article/details/51319033"/> <script type="text/javascript"> var username = "zhangliangzi"; var _blogger = username; var blog_address = "http://blog.csdn.net/zhangliangzi"; var static_host = "http://csdnimg.cn/release/phoenix/"; var currentUserName = ""; var fileName = '51319033'; var commentscount = 5; var islock = false window.quickReplyflag = true; var totalFloor = 4; var isBole = false; var isDigg = false; var isExpert=false; var isAdm = false; </script> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <script src="http://c.csdnimg.cn/public/common/libs/jquery/jquery-1.9.1.min.js" type="text/javascript"></script> <link rel="stylesheet" href="http://c.csdnimg.cn/public/common/libs/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="http://c.csdnimg.cn/public/static/css/avatar.css"> <link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/main-3b7030529b.css"> <link rel="stylesheet" href="http://c.csdnimg.cn/public/common/toolbar/content_toolbar_css/content_toolbar.css"> <script src="http://csdnimg.cn/rabbit/exposure-click/main-1.0.2.js"></script> <script type="text/javascript" src="http://c.csdnimg.cn/pubfooter/js/tracking_for_recommend.js?v=0911" charset="utf-8"></script> <script type="text/javascript" src="http://csdnimg.cn/pubfooter/js/tracking-1.0.2.js" charset="utf-8"></script> <script type="text/javascript" src="http://csdnimg.cn/release/phoenix/production/main-b1ff9eb997.js"></script> <script src="http://dup.baidustatic.com/js/ds.js"></script> <script type="text/javascript"> // Traffic Stats of the entire Web site By baidu var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?6bcd52f51e9b3dce32bec4a3997715ac"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); // Traffic Stats of the entire Web site By baidu end </script> <meta name="description" content="首先Throws(抛出)几个自己学习过程中一直疑惑的问题:1、什么是类加载?类加载的时机?2、什么是类初始化?什么时候进行类初始化?3、什么时候会为变量分配内存?4、什么时候会为变量赋默认初值?什么时候会为变量赋人为设定的初值?5、类加载器是什么?6、如何编写一个自定义的类加载器?首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*" /> <meta name="keywords" content="jvm" /> <meta http-equiv="Cache-Control" content="no-siteapp" /><link rel="alternate" media="handheld" href="#" /> <meta name="shenma-site-verification" content="5a59773ab8077d4a62bf469ab966a63b_1497598848"> <title>JVM类加载机制详解(一)JVM类加载过程 - CSDN博客</title> <link href="http://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"></head><body><script id="toolbar-tpl-scriptId" prod="download" skin="black" src="http://c.csdnimg.cn/public/common/toolbar/js/content_toolbar.js" type="text/javascript" domain="http://blog.csdn.net/"></script><div class="container clearfix"> <main> <article> <h1 class="csdn_top">JVM类加载机制详解(一)JVM类加载过程</h1> <div class="article_bar clearfix"> <div class="artical_tag"> <span class="original"> 原创 </span> <span class="time">2016年05月05日 16:07:06</span> </div> <ul class="article_tags clearfix csdn-tracking-statistics" data-mod="popu_377"> <li class="tit">标签:</li><!-- [startarticletags]--> <li><a href="http://so.csdn.net/so/search/s.do?q=jvm&t=blog" target="_blank">jvm</a> <span>/</span></li> <!-- [endarticletags]--> </ul> <ul class="right_bar"> <li><button class="btn-noborder"><i class="icon iconfont icon-read"></i><span class="txt">11938</span></button></li> <li class="edit"> <a class="btn-noborder" href="" > <i class="icon iconfont icon-bianji"></i><span class="txt">编辑</span> </a> </li> <li class="del"> <a class="btn-noborder" onclick="javascript:deleteArticle(fileName);return false;"> <i class="icon iconfont icon-shanchu"></i><span class="txt">删除</span> </a> </li> </ul> </div> <div id="article_content" class="article_content csdn-tracking-statistics" data-mod="popu_519" data-dsm="post"> <p><span style="font-size:18px;">首先Throws(抛出)几个自己学习过程中一直疑惑的问题:</span></p><p><span style="font-size:18px;">1、什么是类加载?什么时候进行类加载?</span></p><p><span style="font-size:18px;">2、什么是类初始化?什么时候进行类初始化?</span></p><p><span style="font-size:18px;">3、什么时候会为变量分配内存?</span></p><p><span style="font-size:18px;">4、什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值?</span></p><p><span style="font-size:18px;">5、类加载器是什么?</span></p><p><span style="font-size:18px;">6、如何编写一个自定义的类加载器?</span></p><p><br /></p><p><span style="font-size:18px;">首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、转换解析、初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做<strong><span style="color:#3333ff;">JVM的类加载机制</span></strong>。</span></p><p><br /></p><p><span style="font-size:18px;">Class文件中的“类”从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段。类加载机制包括了前五个阶段。</span></p><p><span style="font-size:18px;">如下图所示:</span></p><p><span style="font-size:18px;"><img src="http://img.blog.csdn.net/20160504235346278?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><br /></span></p><p><span style="font-size:18px;">其中,加载、验证、准备、初始化、卸载的<strong><span style="color:#3333ff;">开始顺序</span></strong>是确定的,注意,只是按顺序开始,进行与结束的顺序并不一定。解析阶段可能在初始化之后开始。</span></p><p><br /></p><p><span style="font-size:18px;">另外,类加载无需等到程序中“首次使用”的时候才开始,JVM预先加载某些类也是被允许的。(<strong><span style="color:#3333ff;">类加载的时机</span></strong>)</span></p><p><span style="font-size:18px;"><br /></span></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">一、类的加载</span></strong></span></p><p><span style="font-size:18px;">我们平常说的加载大多不是指的类加载机制,只是类加载机制中的第一步加载。在这个阶段,JVM主要完成三件事:</span></p><p><span style="font-size:18px;"></span></p><p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;font-family:Arial;line-height:26px;"><span style="font-size:18px;">1、通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件)。而获取的方式,可以通过jar包、war包、网络中获取、JSP文件生成等方式。</span></p><p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;font-family:Arial;line-height:26px;"><span style="font-size:18px;">2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。这里只是转化了数据结构,并未合并数据。(方法区就是用来存放已被加载的类信息,常量,静态变量,编译后的代码的运行时内存区域)</span></p><p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;font-family:Arial;line-height:26px;"><span style="font-size:18px;">3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。这个Class对象并没有规定是在Java堆内存中,它比较特殊,虽为对象,但存放在方法区中。</span></p><p><br /></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">二、类的连接</span></strong></span></p><p><span style="font-size:18px;">类的加载过程后生成了类的java.lang.Class对象,接着会进入连接阶段,连接阶段负责将类的二进制数据合并入JRE(Java运行时环境)中。类的连接大致分三个阶段。</span></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">1、验证:</span></strong>验证被加载后的类是否有正确的结构,类数据是否会符合虚拟机的要求,确保不会危害虚拟机安全。</span></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">2、准备:</span></strong>为类的静态变量(static filed)在方法区分配内存,并赋默认初值(0值或null值)。如static int a = 100;</span></p><p><span style="font-size:18px;">静态变量a就会在准备阶段被赋默认值0。</span></p><p><span style="font-size:18px;">对于一般的成员变量是在类实例化时候,随对象一起分配在堆内存中。</span></p><p><span style="font-size:18px;">另外,静态常量(static final filed)会在准备阶段赋程序设定的初值,如static final int a = 666; 静态常量a就会在准备阶段被直接赋值为666,对于静态变量,这个操作是在初始化阶段进行的。</span></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">3、解析:</span></strong>将类的二进制数据中的符号引用换为直接引用。</span></p><p><span style="font-size:18px;"><br /></span></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">三、类的初始化</span></strong></span></p><p><span style="font-size:18px;">类初始化是类加载的最后一步,除了加载阶段,用户可以通过自定义的类加载器参与,其他阶段都完全由虚拟机主导和控制。到了初始化阶段才真正执行Java代码。</span></p><p><span style="font-size:18px;"><strong><span style="color:#3333ff;">类的初始化的主要工作</span></strong>是为静态变量赋程序设定的初值。</span></p><p><span style="font-size:18px;">如static int a = 100;在准备阶段,a被赋默认值0,在初始化阶段就会被赋值为100。</span></p><p><br /></p><p><span style="font-size:18px;">Java虚拟机规范中严格规定了<strong><span style="color:#3333ff;">有且只有五种情况必须对类进行初始化</span></strong>:</span></p><p><span style="font-size:18px;">1、使用new字节码指令创建类的实例,或者使用getstatic、putstatic读取或设置一个静态字段的值(放入常量池中的常量除外),或者调用一个静态方法的时候,对应类必须进行过初始化。</span></p><p><span style="font-size:18px;">2、通过java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则要首先进行初始化。</span></p><p><span style="font-size:18px;">3、当初始化一个类的时候,如果发现其父类没有进行过初始化,则首先触发父类初始化。</span></p><p><span style="font-size:18px;">4、当虚拟机启动时,用户需要指定一个主类(包含main()方法的类),虚拟机会首先初始化这个类。</span></p><p><span style="font-size:18px;">5、使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、RE_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要先触发其初始化。</span></p><p><span style="font-size:18px;"><br /></span></p><p><span style="font-size:18px;">注意,虚拟机规范使用了“有且只有”这个词描述,这五种情况被称为“<strong><span style="color:#3333ff;">主动引用</span></strong>”,除了这五种情况,所有其他的类引用方式都不会触发类初始化,被称为“<strong><span style="color:#3333ff;">被动引用</span></strong>”。</span></p><p><span style="font-size:18px;"><br /></span></p><p><span style="font-size:18px;">被动引用的例子一:</span></p><p><span style="font-size:18px;">通过子类引用父类的静态字段,对于父类属于“主动引用”的第一种情况,对于子类,没有符合“主动引用”的情况,故子类不会进行初始化。代码如下:</span></p><p><span style="font-size:18px;"></span></p><pre class="java">//父类public class SuperClass {//静态变量valuepublic static int value = 666;//静态块,父类初始化时会调用static{System.out.println("父类初始化!");}}//子类public class SubClass extends SuperClass{//静态块,子类初始化时会调用static{System.out.println("子类初始化!");}}//主类、测试类public class NotInit {public static void main(String[] args){System.out.println(SubClass.value);}}</pre><span style="font-size:18px;">输出结果:</span><p></p><p><span style="font-size:18px;"><img src="http://img.blog.csdn.net/20160505154244582?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><br /></span></p><p><span style="font-size:18px;">被动引用的例子之二:</span></p><p><span style="font-size:18px;">通过数组来引用类,不会触发类的初始化,因为是数组new,而类没有被new,所以没有触发任何“主动引用”条款,属于“被动引用”。代码如下:</span></p><p><span style="font-size:18px;"></span></p><pre class="java">//父类public class SuperClass {//静态变量valuepublic static int value = 666;//静态块,父类初始化时会调用static{System.out.println("父类初始化!");}}//主类、测试类public class NotInit {public static void main(String[] args){SuperClass[] test = new SuperClass[10];}}</pre><p></p><pre></pre>没有任何结果输出!<p></p><p><span style="font-size:18px;"></span></p><p><span style="font-size:18px;">被动引用的例子之三:</span></p><p><span style="font-size:18px;">刚刚讲解时也提到,静态常量在编译阶段就会被存入调用类的常量池中,不会引用到定义常量的类,这是一个特例,需要特别记忆,不会触发类的初始化!</span></p><p><span style="font-size:18px;"></span></p><pre class="java">//常量类public class ConstClass {static{System.out.println("常量类初始化!");}public static final String HELLOWORLD = "hello world!";}//主类、测试类public class NotInit {public static void main(String[] args){System.out.println(ConstClass.HELLOWORLD);}}</pre><pre></pre><p><span style="font-size:18px;"><img src="http://img.blog.csdn.net/20160505160902977?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><br /></span></p><p><span style="font-size:18px;">下一篇:<a href="http://blog.csdn.net/zhangliangzi/article/details/51338291">JVM类加载机制详解(二)类加载器与双亲委派模型</a></span></p><p><br /></p> </div> </article> <div class="readall_box csdn-tracking-statistics" data-mod="popu_376"> <div class="read_more_mask"></div> <a class="btn btn-large btn-gray-fred read_more_btn" target="_self">阅读全文</a> </div> <div class="article_copyright"> 版权声明:本文为博主原创文章,未经博主允许不得转载。 </div> <ul class="article_collect clearfix csdn-tracking-statistics" data-mod="popu_378"> <li class="tit">本文已收录于以下专栏:</li><!-- [startarticlecolumns]--> <!-- [endarticlecolumns]--> </ul> <div class="comment_box clearfix"> <div id="comment_form"> <div id="commentsbmitarear"> </div> </div> </div> <div class="comment_li_outbox"> <div id="comment_list"></div> </div> <div class="more_comment"> <div id="comment_bar" class="trackgin-ad" data-mod="popu_385"></div> </div> <h3 class="recommend_tit" id="related">相关文章推荐</h3> <div class="recommend_list clearfix" id="rasss"> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/boyupeng/article/details/47951037" target="_blank" strategy="BlogCommendFromBaidu_0">JVM(三):类加载机制(类加载过程和类加载器)</a></h2> <div class="summary"> 使用java编译器可以把java代码编译为存储字节码的Class文件,使用其他语言的编译器一样可以把程序代码翻译成Class文件,java虚拟机不关心Class的来源是何种语言。如图所示:在Cla... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/boyupeng" target="_blank" strategy="BlogCommendFromBaidu_0"><img src="http://avatar.csdn.net/E/5/7/3_boyupeng.jpg" alt="boyupeng" title="boyupeng"></a></li> <li class="user_name"><a href="http://blog.csdn.net/boyupeng">boyupeng</a></li> <li class="time">2015年08月25日 15:38</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>15585</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/mmc_maodun/article/details/17881581" target="_blank" strategy="BlogCommendFromBaidu_1">【深入Java虚拟机】之四:类加载机制</a></h2> <div class="summary"> 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/mmc_maodun" target="_blank" strategy="BlogCommendFromBaidu_1"><img src="http://avatar.csdn.net/A/1/C/3_mmc_maodun.jpg" alt="mmc_maodun" title="mmc_maodun"></a></li> <li class="user_name"><a href="http://blog.csdn.net/mmc_maodun">mmc_maodun</a></li> <li class="time">2014年01月08日 00:09</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>36371</span></li> </ul> </dd> </dl> <script> (function() { var s = "_" + Math.random().toString(36).slice(2); document.write('<div id="' + s + '"></div>'); (window.slotbydup=window.slotbydup || []).push({ id: '4765209', container: s, size: '808,120', display: 'inlay-fix' }); })(); </script> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/u011116672/article/details/49887585" target="_blank" strategy="BlogCommendFromBaidu_2">深入理解JVM之六:类加载机制</a></h2> <div class="summary"> 前言虚拟机的类加载机制可以简单描述如下:Java虚拟机把描述类的数据从Class文件中加载到内存中,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的Java类型。虚拟机加载进行类加载的过... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/u011116672" target="_blank" strategy="BlogCommendFromBaidu_2"><img src="http://avatar.csdn.net/4/C/6/3_u011116672.jpg" alt="u011116672" title="u011116672"></a></li> <li class="user_name"><a href="http://blog.csdn.net/u011116672">u011116672</a></li> <li class="time">2015年11月17日 14:53</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>778</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/a19881029/article/details/17068191" target="_blank" strategy="BlogCommendFromBaidu_3">JVM笔记6:JVM类加载机制</a></h2> <div class="summary"> 实在是很难弄懂啊 </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/a19881029" target="_blank" strategy="BlogCommendFromBaidu_3"><img src="http://avatar.csdn.net/3/4/7/3_a19881029.jpg" alt="a19881029" title="a19881029"></a></li> <li class="user_name"><a href="http://blog.csdn.net/a19881029">a19881029</a></li> <li class="time">2013年12月06日 13:59</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>16026</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/eff666/article/details/52203406" target="_blank" strategy="BlogCommendFromBaidu_4">java中类的加载顺序介绍(ClassLoader)</a></h2> <div class="summary"> 1、ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常,今天我就来总结一下这个问题。对于这个异常,它实质... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/eff666" target="_blank" strategy="BlogCommendFromBaidu_4"><img src="http://avatar.csdn.net/F/E/F/3_eff666.jpg" alt="eff666" title="eff666"></a></li> <li class="user_name"><a href="http://blog.csdn.net/eff666">eff666</a></li> <li class="time">2016年08月14日 10:44</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>13867</span></li> </ul> </dd> </dl> <!-- 广告位:PC端-博客详情通栏7(feed流)-808*120 --> <script> (function() { var s = "_" + Math.random().toString(36).slice(2); document.write('<div id="' + s + '"></div>'); (window.slotbydup=window.slotbydup || []).push({ id: '4983339', container: s, size: '808,120', display: 'inlay-fix' }); })(); </script> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/u011080472/article/details/51329315" target="_blank" strategy="BlogCommendFromBaidu_5">【深入理解JVM】:类加载机制</a></h2> <div class="summary"> 概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行链接工作的语言不同,... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/u011080472" target="_blank" strategy="BlogCommendFromBaidu_5"><img src="http://avatar.csdn.net/A/5/B/3_u011080472.jpg" alt="u011080472" title="u011080472"></a></li> <li class="user_name"><a href="http://blog.csdn.net/u011080472">u011080472</a></li> <li class="time">2016年05月06日 10:13</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>3041</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/dd864140130/article/details/49817357" target="_blank" strategy="BlogCommendFromBaidu_6">深入JVM类加载机制</a></h2> <div class="summary"> 类加载的流程以及双亲委派模型 </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/dd864140130" target="_blank" strategy="BlogCommendFromBaidu_6"><img src="http://avatar.csdn.net/B/2/6/3_dd864140130.jpg" alt="dd864140130" title="dd864140130"></a></li> <li class="user_name"><a href="http://blog.csdn.net/dd864140130">dd864140130</a></li> <li class="time">2015年11月13日 14:13</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>4483</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/u013256816/article/details/50829596" target="_blank" strategy="BlogCommendFromBaidu_7">Java虚拟机类加载机制</a></h2> <div class="summary"> 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的。随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。闲话不多说,老规矩... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/u013256816" target="_blank" strategy="BlogCommendFromBaidu_7"><img src="http://avatar.csdn.net/6/5/8/3_u013256816.jpg" alt="u013256816" title="u013256816"></a></li> <li class="user_name"><a href="http://blog.csdn.net/u013256816">u013256816</a></li> <li class="time">2016年03月08日 18:52</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>9570</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/u014470581/article/details/51350679" target="_blank" strategy="BlogCommendFromBaidu_8">Java类加载机制与反射 jvm学习</a></h2> <div class="summary"> 同一个JVM的有线程、所有变量都处于同一个进程里,他们都使用JVM进程的内存区。当系统出现以下几种情况时JVM进程将被终止:1、程序运行到最后正常结束2、程序运行到使用System.exit()或... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/u014470581" target="_blank" strategy="BlogCommendFromBaidu_8"><img src="http://avatar.csdn.net/A/9/8/3_u014470581.jpg" alt="u014470581" title="u014470581"></a></li> <li class="user_name"><a href="http://blog.csdn.net/u014470581">u014470581</a></li> <li class="time">2016年05月09日 09:32</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>687</span></li> </ul> </dd> </dl> <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post"> <dd> <h2><a href="http://blog.csdn.net/wqc_CSDN/article/details/54379136" target="_blank" strategy="BlogCommendFromBaidu_9">《深入理解JVM》--JVM类加载机制总结</a></h2> <div class="summary"> 概述:虚拟机的类加载机制主要是指:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的一整套机制类的加载流程:其主要的加载流... </div> <ul> <li class="avatar_img"><a href="http://blog.csdn.net/wqc_CSDN" target="_blank" strategy="BlogCommendFromBaidu_9"><img src="http://avatar.csdn.net/C/C/8/3_wqc_csdn.jpg" alt="wqc_CSDN" title="wqc_CSDN"></a></li> <li class="user_name"><a href="http://blog.csdn.net/wqc_CSDN">wqc_CSDN</a></li> <li class="time">2017年01月15日 21:43</li> <li class="visited_num"><i class="icon iconfont icon-read"></i><span>236</span></li> </ul> </dd> </dl> </div> </main><aside> <div class="right_box user_info"> <dl class="inf_bar clearfix"> <dt class="csdn-tracking-statistics" data-mod="popu_381"> <a href="http://blog.csdn.net/zhangliangzi" target="_blank"> <img src="http://avatar.csdn.net/4/4/3/3_zhangliangzi.jpg" class="avatar_pic"> </a> <span class="medals" title=""> </span> </dt> <dd> <h3 class="csdn-tracking-statistics" data-mod="popu_380"><a href="http://blog.csdn.net/zhangliangzi" target="_blank" id="uid">zhangliangzi</a></h3> <span class="csdn-tracking-statistics" data-mod="popu_379"><a class="btn btn-redborder-small " id="span_add_follow" target="_self">+关注</a></span> </dd> </dl> <div class="inf_number_box clearfix"> <dl> <dt>原创</dt> <dd>96</dd> </dl> <dl> <dt>粉丝</dt> <dd id='fan'>194</dd> </dl> <dl> <dt>喜欢</dt> <dd>0</dd> </dl> <dl> <dt>码云</dt> <dd> </dd> </dl> </div> <div class="writings"> <div class="public_signal clearfix"> <h3>他的最新文章</h3> <a href="http://blog.csdn.net/zhangliangzi" target="_blank" class="more"><span>更多文章</span></a> </div> <ul class="inf_list clearfix csdn-tracking-statistics" data-mod="popu_382"> <li class="clearfix"> <a href="http://blog.csdn.net/zhangliangzi/article/details/78703048" target="_blank">平时工作中一定会用到的Linux指令(每周会持续更新~)</a> </li> <li class="clearfix"> <a href="http://blog.csdn.net/zhangliangzi/article/details/78257593" target="_blank">Nginx——location常见配置指令,alias、root、proxy_pass</a> </li> <li class="clearfix"> <a href="http://blog.csdn.net/zhangliangzi/article/details/77951762" target="_blank">初识Redis与Memcached</a> </li> </ul> </div> </div> <div class="user-hotArticle"> <h3><a href="#related" >相关推荐</a></h3> <ul class="hotArticle-list csdn-tracking-statistics" data-mod="popu_563"><!-- [StartRelatedArticles]--> <li> <a href="http://blog.csdn.net/boyupeng/article/details/47951037" data-mod="popu_559">JVM(三):类加载机制(类加载过程和类加载器)</a> </li> <li> <a href="http://blog.csdn.net/mmc_maodun/article/details/17881581" data-mod="popu_560">【深入Java虚拟机】之四:类加载机制</a> </li> <li> <a href="http://blog.csdn.net/u011116672/article/details/49887585" data-mod="popu_561">深入理解JVM之六:类加载机制</a> </li> <li> <a href="http://blog.csdn.net/a19881029/article/details/17068191" data-mod="popu_562">JVM笔记6:JVM类加载机制</a> </li> <!-- [EndRelatedArticles]--> </ul> </div> <div class="extension_other csdn-tracking-statistics" data-mod="popu_389"> <!--u3032528--> <div class="flashrecommend"> <script type="text/javascript" src="http://mpb1.iteye.com/bwocoltlyzdec.js"></script> </div> </div><!-- [StartShowSelfColumn]--> <!-- [EndShowSelfColumn]--> <div class="fixRight"> <!-- 广告位:PC端-博客详情右侧视窗2(feed流)-300*300 --> <script> (function() { var s = "_" + Math.random().toString(36).slice(2); document.write('<div id="' + s + '"></div>'); (window.slotbydup=window.slotbydup || []).push({ id: '5384130', container: s, size: '300,300', display: 'inlay-fix' }); })(); </script> <div class="extension_other csdn-tracking-statistics bottomRcom" data-mod="popu_389" style="position:absolute;z-index:-5;opacity:0;pointer-events:none"> <!--u3032528--> <div class="flashrecommend"> <!-- 请置于所有广告位代码之前 --> <script src="http://dup.baidustatic.com/js/dm.js"></script> <!-- 广告位:PC端-博客详情页右侧视窗1(feed流)-300*250 --> <script> (function() { var s = "_" + Math.random().toString(36).slice(2); document.write('<div id="' + s + '"></div>'); (window.slotbydup=window.slotbydup || []).push({ id: '4770930', container: s, size: '300,250', display: 'inlay-fix' }); })(); </script> </div> </div> </div> <div class="user-hotArticle"> <h3>他的热门文章</h3> <ul class="hotArticle-list csdn-tracking-statistics" data-mod="popu_521"><!-- [StartHotArticles]--> <li> <a href="http://blog.csdn.net/zhangliangzi/article/details/51336564">HTTP必知必会——常见面试题总结</a> <div class="read list-left"><i class="icon iconfont icon-read"></i><span>25224</span></div> </li> <li> <a href="http://blog.csdn.net/zhangliangzi/article/details/51590216">一个典型的SSH登录与增删改查demo详解+源代码</a> <div class="read list-left"><i class="icon iconfont icon-read"></i><span>23259</span></div> </li> <li> <a href="http://blog.csdn.net/zhangliangzi/article/details/50617374">域名与IP地址的联系与区别</a> <div class="read list-left"><i class="icon iconfont icon-read"></i><span>16168</span></div> </li> <li> <a href="http://blog.csdn.net/zhangliangzi/article/details/51395940">MySQL高级查询——连接查询实例详解</a> <div class="read list-left"><i class="icon iconfont icon-read"></i><span>16152</span></div> </li> <li> <a href="http://blog.csdn.net/zhangliangzi/article/details/50635576">SpringMVC工作原理概述</a> <div class="read list-left"><i class="icon iconfont icon-read"></i><span>14762</span></div> </li> <!-- [EndHotArticles]--> </ul> </div><!-- [startcustom]--> <!-- [endcustom]--></aside></div><div class="left_fixed"> <div class="left_show_button"> <span> <i class="icon iconfont icon-youjiantou"></i> </span> </div> <ul class="left_menu"> <li> <button class="left-fixed-btn btn-like csdn-tracking-statistics" data-mod="popu_373" target="_self"> <a href="javascript:void(0);" class="iconbox border_red"><i class="icon iconfont icon-dianzan"></i></a> <a class="txt" href="javascript:void(0);">7</a> </button> </li> <li id="blog_artical_directory"> <button class="left-fixed-btn left_menu_btn csdn-tracking-statistics" data-mod="popu_372" target="_self"> <a href="javascript:void(0);" class="iconbox border_black"><i class="icon iconfont icon-mulu"></i></a> </button> </li> <li class="menu_con"> <div class="list_father"> <div class="arr_box"> <button class="btn-noborder arr-btn scroll-down left_scroll_down"><i class="icon iconfont icon-xiajiantou"></i></button> <button class="btn-noborder arr-btn scroll-up left_scroll_top"><i class="icon iconfont icon-shangjiantou"></i></button> </div> <div class="arr"></div> <div id="csdnBlogDir"></div> </div> </li> <!-- <li>--> <!-- <button class="left-fixed-btn btn-like tracking-ad" data-mod="popu_373" target="_self">--> <!-- <span class="iconbox border_red"><i class="icon iconfont icon-xihuan-"></i></span>--> <!-- <span class="txt">喜欢</span>--> <!-- <span class="untxt">取消喜欢</span>--> <!-- </button>--> <!-- </li>--> <li> <button class="left-fixed-btn csdn-tracking-statistics" data-mod="popu_374" id="com-quick-collect" target="_self"> <a href="javascript:void(0);" class="iconbox border_purple"><i class="icon iconfont icon-shoucang"></i></a> </button> </li> <li> <button class="left-fixed-btn btn-pinglun csdn-tracking-statistics" data-mod="popu_544" > <a href="javascript:void(0);" class="iconbox border_purple"><i class="icon iconfont icon-pinglun"></i></a> </button> </li> <li id="share_box"> <button class="left-fixed-btn csdn-tracking-statistics" data-mod="popu_375" target="_self"> <a href="javascript:void(0);" class="iconbox border_orange"><i class="icon iconfont icon-fenxiang"></i></a> </button> <div class="bdsharebuttonbox csdn-tracking-statistics" data-mod="popu_172"> <div class="outside"> <span class="iconbox border_red2"><i class="icon iconfont icon-xinlang"></i></span> <a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"> </a> </div> <div class="outside"> <span class="iconbox border_green"><i class="icon iconfont icon-weixin"></i></span> <a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"> </a> </div> <div class="outside"> <span class="iconbox border_blue"><i class="icon iconfont icon-QQ"></i></span> <a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"> </a> </div> </div> </li> </ul></div><div class="right_fixed"> <div class="r_ico"> <i class="icon iconfont icon-jubao"></i> <span class="txt" id="reportBtn">内容举报</span> </div> <div class="returnTop"> <i class="icon iconfont icon-fanhuidingbu"></i> <span>返回顶部</span> </div></div><div id="pop_win"></div><div id="popup_mask"></div><div class="pop_CA_cover" ></div><div class="pop pop_CA" > <div class="CA_header"> 收藏助手 <span class="cancel_icon" id="fapancle" ></span> </div> <iframe src="" id="collectIframe" frameborder="0" width="100%" height="360" scrolling="no" ></iframe></div><!--举报--><div id="report_dialog" style="top: 250px; left: 343.5px;"><div id="panel_report"> <div class="panel_head">不良信息举报</div> <form method="post" id="frmReport" class="panel_body"> <table border="0" cellpadding="0" cellspacing="4" class="pop_table"> <tbody><tr><td colspan="2">您举报文章:<a href="http://blog.csdn.net/zhangliangzi/article/details/51319033" target="_blank">JVM类加载机制详解(一)JVM类加载过程</a></td></tr> <tr> <th style="width:60px;">举报原因:</th> <td id="panel_reporttype"> <label><input type="radio" class="report_type" id="report_sex" name="report_type" value="1">色情</label> <label><input type="radio" class="report_type" id="report_Politics" name="report_type" value="2">政治</label> <label><input type="radio" class="report_type" id="report_copy" name="report_type" value="3">抄袭</label> <label><input type="radio" class="report_type" id="report_ad" name="report_type" value="4">广告</label> <label><input type="radio" class="report_type" id="report_want" name="report_type" value="5">招聘</label> <label><input type="radio" class="report_type" id="report_call" name="report_type" value="6">骂人</label> <br> <label><input type="radio" class="report_type" id="report_other" name="report_type" value="7">其他</label> <input type="text" name="report_other_content" id="report_other_content" maxlength="30" style="display: none;"> </td> </tr> <tr id="panel_originalurl" style="display: none;"> <th>原文地址:</th> <td> <input id="originalurl" value="http://" name="originalurl" type="text" style="width: 90%;"> </td> </tr> <tr> <th id="sp_reason">原因补充:</th> <td> <textarea id="report_description" style="width: 300px;" rows="3" name="report_description"></textarea> <p id="sp_n" style="color:#999;margin:0px;padding:0px;">(最多只允许输入30个字)</p> </td> </tr> <tr> <td></td> <td> <input id="btnSubmitReport" name="submit" type="image" align="middle" class="btn_1" src="http://csdnimg.cn/release/phoenix/images/btn_submit.jpg"> <span style="padding-left:20px;"></span> <img id="btnCloseReportDialog" src="http://csdnimg.cn/release/phoenix/images/btn_cancel.jpg" align="middle"> <div id="error" style="color: Red"> </div> </td> </tr> </tbody></table> </form></div> <script language="javascript" type="text/javascript"> var isComment=0; //显示隐藏地址 $(function () { console.log("version:phoenix"); if(isComment){ $("#report_description").attr("disabled",true); $("#sp_n").hide(); $("#sp_reason").html("评论内容:"); } $(".report_type").click(function () { $("#panel_originalurl,#report_other_content").hide(); switch ($(this).val()) { case '3': $("#panel_originalurl").show(); $("#originalurl").focus(); break; case '7': if(isComment){ $("#report_other_content").show().focus(); } break; } }); $("#frmReport").submit(function () { if (!currentUserName) { if (confirm("您的操作必须登录,是否登录?")) { location.href = "http://passport.csdn.net/account/login?from=" + encodeURIComponent(location.href); return false; } return false; } var reportType = $("input[name=report_type]:checked").val(); if(!reportType){ alert("请选择举报原因!"); return false; } var otherInfo = ""; switch (reportType) { case '3': otherInfo = $("#originalurl").val(); if (otherInfo == ""||otherInfo=="http://") { alert("举报抄袭必须提供原创文章地址!"); $("#originalurl").focus(); return false; } else if(!checkeURL(otherInfo)) { alert("请输入正确的原创文章地址!"); $("#originalurl").focus(); return false; } break; case '7': otherInfo = $("#report_other_content").val(); if (isComment && !otherInfo) { alert("请填写举报的具体原因!"); $("#report_other_content").focus(); return false; } if(!isComment){ if(!$("#report_description").val()){ alert("请填写举报的具体原因!"); $("#report_description").focus(); return false; } } break; } if(!isComment){ if($("#report_description").val().length>30){ alert("举报原因最多只允许输入30个字!"); return false; } } nowTime = { year: new Date().getFullYear(), month: parseInt(new Date().getMonth())+1, day: new Date().getDate(), hours: parseInt(new Date().getHours())+1, minutes: parseInt(new Date().getMinutes())+1, seconds: parseInt(new Date().getSeconds())+1 }; var data = { articleId: fileName, commentId: 0, reportType: reportType, originalurl: $("#originalurl").val(), report_other_content: $("#report_other_content").val(), report_description: $("#report_description").val(), currentUserName: currentUserName, updatetime: nowTime.year+'/'+nowTime.month+'/'+nowTime.day+' '+ nowTime.hours+':'+nowTime.minutes+':'+seconds, blogUser: username }; if(!isComment){//如果是举报文章 data.report_other_content = data.report_description; // data.report_description = "1. 神经网络这是一个常见的神经网络的图:这是一个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层"; } $.post(blog_address + "/common/report?id="+fileName+"&t=2", data, function (data) { if (data.result == 1){ SetError("感谢您的举报,我们会尽快审核!"); }else{ if (data.content) alert(data.content); } }); return false; }); $("#btnCloseReportDialog").click(function () { CloseDiv(); }); }); //提示后关闭方法 function SetError(error) { $("#btnCloseReportDialog").trigger("click"); alert(error); CloseDiv(); } //关闭方法 function CloseDiv() { $.removeMask(); $("#report_dialog").hide(); return false; } //验证url function checkeURL(url){ return /^http(s)?:\/\/([\w-]+\.)+[\w-]+/i.test(url); } </script></div><!-- fixme 后期清理掉 --><div id="a52b5334d" style="width: 1px; height: 1px; display: none;"> <script id="adJs52b5334"></script> <script>document.getElementById("adJs52b5334").src = "http://ads.csdn.net/js/opt/52b5334.js?t=" + Math.random();</script></div><script src="http://c.csdnimg.cn/public/common/libs/bootstrap/js/bootstrap.min.js" type="text/javascript"></script><script type="text/javascript" src="http://csdnimg.cn/release/phoenix/bower-libs/MathJax/MathJax.js?config=TeX-AMS_HTML"></script><!-- <script type="text/javascript" src="http://passport.csdn.net/content/loginbox/login.js"></script> --><script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script><script type="text/javascript" > if($(".article_collect li").length==1){$(".article_collect").hide();} if($(".article_tags li").length==1){$(".article_tags").hide();} $(".edit a").attr("href","http://write.blog.csdn.net/postedit/"+fileName); $.each($(".edu_li a"),function(){$(this).attr("href",$(this).attr("href").replace("blog7","blog9"))}); new CNick('#uid').showNickname(); if($("#fan").html()=="") { $("#fan").html(0); }</script><script src="http://c.csdnimg.cn/public/common/append_mark/appendMark.min.js?v=5.00.43" type="text/javascript"></script><script type="text/javascript"> appendMark($('.recommend_list').children('a').find('dt'),$('.extension_other'))</script><div class=""id="loginWrap"></div><div class="" id="dlMask"></div></body>
阅读全文
0 0
- java
- JAVA
- JAVA
- JAVA
- java
- Java
- Java
- JAVA:
- java
- java
- java
- java
- Java
- java
- java
- java
- JAVA?
- java
- Quick.Fringeer.v4.52 1CD全面功能高级
- Android 自定义view接收输入法输入的内容并显示在view上
- springmvc的controller返回值
- SG 函数,博弈论
- GLSurfaceView 转载 2012年04月30日 13:13:47 标签:buffer /float /class /android /活动 /ui 8543 GLSurfaceView是一个
- java
- Thrift开发接口
- Understandings about micro-services
- spring feign http客户端连接池配置以及spring zuul http客户端连接池配置解析
- JavaScript基础
- Java并发编程札记-(四)JUC锁-02Lock与ReentrantLock
- HUE安装
- java.lang.IllegalArgumentException You cannot start a load for a destroyed activity
- linux下使用c语言模拟tail [-n] 命令