【转自:https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=416976590&idx=1&sn=22823ada76d8cfd26a43e8d3a7b7a60e】

前言:本文主要想讲一下Java 虚拟机的故事, 可能有点偏门,不妥之处欢迎留言交流。

第一回 陌生警察

我出生在 C 盘下面一个很深层次的目录下, 也不知道是谁把我放到这里的。

我一直在睡觉,外边的日出日落,风雨雷电和我一点关系都没有。

直到有一天,有个家伙咣咣咣砸我房门把我叫醒。

这个家伙穿着像警察的制服, 左手拿着一个对讲机, 右手递过来他的工作证: “你好, 我是Classloader,  请问你是Account类吗”

“是啊, 怎么了?”

这个Classloader 没回答我, 反而拿起对讲机:

“头儿,你看看你能不能装载这个Account类?”

对讲机那头好像也在问他的上司,过了半天,终于有了回音:

“我装载不了, 我的上级也说了,他们也装载不了, 你来干吧”

“那就报数吧~” 我这次注意到旁边站着另外一个笑眯眯的小个子。

“报什么数?” 我一脸诧异。

“唉,果然没有被装载过, 你是个class 文件,当然要报文件开头的那几个数了, 就是Java 他爸James Gosling 在jdk 1.0时确定的那个数啊”

“奥, 我看看, 0xCAFEBABE”

“不错, 是个java 类, 把你后边的两个数也报一下”, 小个子继续问

“50 , 0”

“看来版本不高啊, 是jdk 1.6编译出来的啊”,  小个子接着说 “最新的虚拟机都1.8了,  都函数式了,你造不?”

我哪里知道? 我这才模模糊糊的回想起来, 好像是有个什么javac 把我创建出来,扔到了这个屋子里。

“现在奉命带你去Java 虚拟机, 有人需要你的帮助” , 这个Classloader 态度冷冰冰的, 我不喜欢他。

“大哥,你们咋找到我的?”  我决定和小个子套近乎。

“那还不简单, 我们老板有个列表, 上面列举着所有应该检查的目录,我们顺藤摸瓜,一个一个找,肯定能找到”

“那万一找不到咋办?”

“基本不可能, 你看老板给我们的目录列表中有 C:\workspace\myTaobao\bin  , 我们在下面再找三级 com/mytaobao/domain, 这不就找到你了吗,

Account.class , 话说回来, 万一真找不到, 将来在执行时会抛出ClassNotFound异常了, 那不归我们管”

我后来才知道, 我的全名其实叫做com.mytaobao.domain.Account !

“来来来, 让我验证一下, 你这class编译的对不对” ,小个子拿出一个放大镜

“恩, 常量池,  访问标识, 字段,方法… 看起来没有问题“ , 小个子对Classloader说。

被人拿着放大镜看,这种感觉极为不爽。

“走, 去虚拟机”  , Classloader还是冷冰冰的。

这哥俩不容我带任何东西, 便把我推上车,飞奔向我没听说过的“虚拟机”。

第二回 刺探信息

我感到前途未卜, 但也不能坐以待毙, 一定得多了解信息。

“大哥, 你叫什么名字” , 我看小个子还算和气。

“我就是大名鼎鼎的文件验证器了, 能管很多事”

“那刚才他为啥还得请示上级呢” , 我用眼神指了一下开车的ClassLoader

文件验证器的声音一下子就压低了:

“你不知道,说来话长, 我们之前出现过事故,有个黑客写了个类java.lang.String,  和我们老板手下有一个干活最卖力的员工名字一模一样,只是这个黑客类里边竟然有格式化硬盘的代码,我们的小兵Classloader 不明就里,就把这个黑客类给先装载了,也执行了, 最后的结果,唉,很惨的…

“那后来怎么办?”

“后来我们老板就定下了规矩:他的骨干员工像String, ArrayList等只能由他自己的心腹去装载, 我听说老板的心腹都是分层级的,像传销一样, 每个都有上线, 最顶层的叫Bootstrap Classloader , 下一次级叫Extension Classloader, 现在开车的这位其实叫App Classloader,位于最底层,  咱这位Classloader 在装载一个类之前,一定要问一问这几位权利极高的大爷,请他们先装载,这几位爷装载不了,才由我们这些小兵来出马。“

“这能避免黑客攻击?”

“能啊! 你想想, 那个黑客写了个攻击的java.lang.String,  我们在装载之前,肯定要请示Extension, Bootstrap这些大爷先来装载, 由于String是老板的核心员工,肯定会他们先装载啊, 这些大爷把String 直接就给我们了, 我们就不会装载黑客类了”

“你能不能少说两句” Classloader 似乎生气了。

我和文件验证器只好禁声。

其实文件验证器也不是只会给我吹牛, 他也很敬业, 这家伙在车上把我全部的字节码都要了过去, 对这些天书一般的东西一遍一遍的检查分析,确保每个指令都是正确的, 检查是不是有超类, 是不是覆盖了final方法,跳转指令是不是正确….

第三回 初识虚拟机

很快我们就来到了目的地, 我一看虚拟机不就是几个大楼嘛, 不过这几座大楼可真是高啊。

他俩把我带进其中一座叫“方法区”的大楼,进了电梯, 输入2048 。

很快来到第2048层, 无数的格子间平铺开来,他们七拐八拐,轻松的把我带到了我的位置, 上面写着我的名字“com.mytaobao.domain.Account”.

我问文件验证器: “这楼这么高, 这么多格子间, 人会坐满吗?”

“只有极少情况会坐满, 一旦满了,那时候会抛出异常, 我们就完蛋了。 你自己好自为之吧, 再见 “

他们把我安顿好就立刻离开了。

我往周边一看, 咦,这不是著名的java.lang.String吗。

我本想和他打个招呼, 可以他的电话似乎一直没断过, 嘴里一直说着什么store, load之类我听不懂但是似乎有点熟悉的话。

正无聊着呢,我桌子上的电话也响了, 电脑屏幕也亮了,我看到一个人对我笑着说:

“你好, 我刚刚new 出来的Account对象, 我的编号是Account@659e0bfd”

晕倒 ! 这家伙和我什么关系?

看我一脸的诧异, 他说,“ 很快就会有个线程到CPU车间了,他会联系你, 我就是想确认下你在不在,  奥对了, 我在一个叫做堆的地方, 有空找我玩啊, byebye ”, 说完就消失了。

果然没多久, 视频电话又响了。

这次我看到一个人站在一个明亮的车间里, 抱着一个包裹, 他按了一个按钮, 面前立刻升起一个工作台 , 台子上立了一个有很多抽屉的柜子,每个抽屉上都有一个编号, 旁边还有一个深桶。

(后来我就知道, 那个柜子的学名叫做局部变量区 , 那个桶叫做 操作数栈)

我正想问问问怎么回事呢, 就听到了他的声音:

“我是线程0x3704,  我要调用你第二个方法了“

(注: 不认识线程0x3704的同学可以查看《我是一个线程》)

我一看, 我的第二个方法是add :

public void add(int x , int y ){x = x + y;.....其他代码略....
}

(注: Account类当然看不到这些源码, 这是为了方便你看的

【趣文】我是一个Java class相关推荐

  1. 我是一个Java class

    文章转载自公众号:码农翻身 作者:老刘 第一回 陌生警察 我出生在C盘下面一个很深层次的目录下, 也不知道是谁把我放到这里的. 我一直在睡觉,外边的日出日落,风雨雷电和我一点关系都没有. 直到有一天, ...

  2. 我是一个Java程序员!我今年30岁!

    程序员的30岁 30 岁程序员,差不多已有了 8-10 年的编程工作经验.8-10 年差不多是一个高级软件架构师应该具有的基本工作年限.不少人在 30 岁时已经做到了高级架构师,带着团队:不少人虽然没 ...

  3. html项目_趣图:我是一个 HTML 开发者,你们看看我做的这个项目咋样?

    (给程序员的那些事加星标,每天看趣图) 我是一个 HTML 开发者, 这是我做的 Web 项目, 大家来点评一下 ↓↓↓ 关注@程序员的那些事  视频号,带你愉快地提升编程水平!??? 提示:上班摸鱼 ...

  4. 一个JAVA class的秘密

    为什么80%的码农都做不了架构师?>>>    今天看了刘欣写的<我是一个java class>感觉很有意思,最近刚好在看JAVA的构造函数,今天坐火车无聊有点时间,狗尾 ...

  5. 【趣文】我是一个线程

    [作者:IBM刘欣  来自:码农翻身 ] 我是一个线程, 我一出生就被编了个号: 0x3704,  然后被领到一个昏暗的屋子里,  这里我发现了很多和我一模一样的同伴. 我身边的同伴0x6900 待的 ...

  6. (趣文)我是一个线程

    来自:码农翻身(微信号:coderising) 作者:IBM 刘欣 我是一个线程,我一出生就被编了个号: 0×3704,然后被领到一个昏暗的屋子里, 这里我发现了很多和我一模一样的同伴. 我身边的同伴 ...

  7. 【趣话编程】一个Java对象的回忆录:垃圾回收

    简介:趣话编程第三期,今天让我们一起去看看一个Java对象的回忆录:垃圾回收. 原文链接 对象的诞生 "你醒啦!",迷迷糊糊中听到一个声音,我睁开了眼睛,发现一个小伙伴正看着我. ...

  8. 第一个java程序的错误_我是一名java初学者,执行第一个java程序welcome.java出现了以下错误,这是为什么?...

    我是一名java初学者,执行第一个java程序welcome.java出现了以下错误,这是为什么? welcome.java: import javax.swing.*; public class w ...

  9. 编写一个Java应用程序。用户从键盘输入一个1~99999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121、3223

    编写一个Java应用程序.用户从键盘输入一个1-99999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数.回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121.3223 ...

最新文章

  1. mysql show tables_mysql — show tables的结果不一定准确 | 学步园
  2. Intel汇编语言程序设计学习-第六章 条件处理-上
  3. 3D 投影矩阵学习1
  4. 关于Java中serialUID的序列化的问题
  5. 第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)
  6. 【java笔记】接口的定义,接口的使用
  7. soapUI(groovy脚本作用1)请不要问为什么系列1
  8. c#rs232与三菱通讯_三菱各系统的RS232通讯接口汇总
  9. Java soso移动大厅项目
  10. Ethereum ETH的奖励机制
  11. 狄利克雷卷积_狄利克雷卷积莫比乌斯反演总结
  12. EasyNVR无插件摄像机直播之:摄像机网页低延时无插件直播实现
  13. 【Spring】Spring面试题
  14. 【网络安全】beef-xss实操以及xss修复方案
  15. 医疗器械经营许可证,您了解多少?
  16. 推荐最适合IT人自学的视频网站和社区网站
  17. 【每日一题Day35】LC878第N个神奇数字 | 二分查找 找规律 + 数学
  18. 物联网项目(二)初建团队
  19. 用layui做一个简易的登录注册页面
  20. leetcode 打卡 day58

热门文章

  1. oracle四大语言_oracle是用什么语言?是SQL语言吗?
  2. 聊聊feign的Contract
  3. 维克森林大学计算机科学专业好不好,维克森林大学商业分析硕士怎么样?
  4. html把键显示在中间,ipad平板键盘显示在屏幕中间怎么办?
  5. 教教大家vmware虚拟机安装win11的方法
  6. 重装系统Win7步骤
  7. 大咖说·图书分享|了不起的JavaScript工程师:从前端到全端高级进阶
  8. 哪类数字域名更优秀?数字域名价值高吗?
  9. 手淘图片库新特性解析
  10. Axure RP 8.1.0.3377 for Mac