JVM帝国一日游【穿越小说】

        就在学习Java的第一天,环境搭建一切进展顺利,idea中小心翼翼创建类名为HelloWorld的java文件,并一字一句敲下main函数,main方法里写下System.out.print("Hello World")。接着胆战心惊的Run as JavaApplication..控制台出现....

        盯着这行Hello Word...忽然眼前一片漆黑,接着刺眼的绿光闪过——

        下意识闭上眼睛,等睁开眼睛,眼前的场景令我震惊.......

         “这是——”我刚张嘴,旁边一个工作人员说:“欢迎来到JVM帝国,有什么疑惑我可以为你解答。”

        “我怎么会到这里?”

        “凡是System.out.print("Hello World")人类都有机会到此一游。”

        ......

        无语之时,只见几个🥷黑衣人手举一堆数字和英文字符匆匆走过。

        我十分好奇问道:“这拿的是什么?”

        “噢,新送进来的字节码文件,他们要被使用了,正在做些准备工作。”

        “莫非....这黑衣人🥷大哥是类加载器?”我瞪圆眼睛问道。

        “正是...”

        没等工作人员话音落下,我已经冲过去拉住黑衣大哥的手:“类加载器大哥,受小弟一拜。”怎奈黑衣大哥力大无穷,不但没有被我拦住,反而把我顺势带进了一个大空间,里面复杂而有序的滚动着代码。

        “大哥,这是哪啊?”

        “堆空间”。黑衣人就是黑衣人,很冷酷嘛。

        只见黑衣大哥们把字节码文件放到了堆空间一个小空间中,工作人员接过字节码文件换了标签并把一串地址交给了黑衣人大哥,我一看——“class对象”,黑衣人大哥转身要走,我喊道:“你去哪里?”

        “地址交回方法区。”我心想方法区又是哪里啊,我要不要跟他走.....

        堆空间的工作人员他们开始逐字检查着,并用对讲机说到:“验证通过。”对讲机里传来熟悉的黑衣人大哥的声音:“收到。解析完成,方法区符号引用已转直接引用。”

        感叹这工作效率真是紧促又缜密,没等我多想,对讲机里传来陌生的声音:“接到new指令,对象逃逸”。我问工作人员:“对象逃跑了?”

        “逃逸是逃逸分析,创建对象分配内存前,分析发现需创建的此对象有被其它对象引用,因此不能在线程栈中分配内存,要到堆来为此创建的对象分配内存空间。”工作人员耐心解释道。

        我不禁杠了起来:“放栈里会怎样?”

        “线程销毁,栈会随之释放,对象会丢了,如何向其它引用此对象的对象们负责呢?”

        我频频点头嘀咕道:“如果我有对象要把对象放堆里,这样对象就不会丢啦!”沾沾自喜时我看到工作人员从class对象中取出部分信息转身到一处全是对象的地方又划分了一块空间放入这个新生对象,随后把指针挪到了这个对象之后。我说:“这里的对象排列很整齐耶。”

        工作人员解释道:“放对象的空间都是整理过的。”我似懂非懂点了头。

        随即看工作人员在加工这个对象,我问:“在加工对象吗?”

        “我在设置对象头。”我凑过去一看......这也不是个正常的头👴🏼啊......

        “这么长的对象头!头真大”,我正唠叨,工作人员说不可小瞧这对象头,除了填充的占位无所事事,其它记录着重要信息。

        “举个栗子🌰呢?”

        “记录了分代年龄,锁信息,hashcode...且不同状态信息变化多端。”这么大对象头令我头大。

        “对象有年龄?”我挑了一个我听懂的词发问。

        “等下GC来了你就知道了。”工作人员提到GC,我不禁想到Gucci还是GD还是哪个说唱组合。

        虽然陪着我闲聊,但是工作人员手里的工作并没有停下,一会儿的功夫就叫来一年轻小伙子,工作制服上胸牌戴着<init>。一顿操作猛如虎,又是赋值又是执行静态代码块又是执行构造方法....一问工资3500。我说和我差不多嘛,人家说美元。我说打扰了。

        一位身着橙色背心战士让我挪下脚,我小心翼翼往旁边站了站,只见他修改了对象头,我不知哪来的自信伸手去阻拦:“这对象头存着重要信息,可不能乱动啊!”这大哥扭过头来吓我一跳!左G右C大纹身胸口纹着“garbage collection”

        “诚不欺我!GC来了!”我转头对工作人员说道。并向工作人员打小报告:“我看GC动了对象头信息!”

        “没错,GC经过一次,对象年龄就会+1。”我恍然大悟,这对象转眼间就一岁啦!“那对象能活几岁呀?”

        GC大哥骄傲的亮出他的胸牌——“Parallel Scavenge”,

        “平行打扫?跟谁平行呢?”

        GC大哥用下巴指给我远处,哇,好多橙色背心GC大哥们,这是团伙啊。这GC大哥没有回答我对象能活多大,是不是记仇啊,不行,我要自己破案!

        那些大哥手捧对象穿越一道橙色光门,我一溜小跑追过去看那个被公主抱的对象多大岁数了......15岁?小小年纪就丧生了,悲从心头涌现出来,我说“好可惜,英年早逝”

        “没死呢!”只见那被GC大哥公主抱的对象怼我。

        我为了表示感恩,搭把手一起抬着对象走出去,实际是好奇橙色光门里面是什么......

        进去才发现,比刚才的空间小多了,不禁失望。工作人员解释道:“survivor区域确实只占了堆空间的1/3的1/5。”我又迷糊了,那这么说刚才那是堆空间的1/3的1/5?

        工作人员对我们的对话感到好笑,说:“是的,堆空间的年轻代占堆的1/3,你刚刚在的eden区又占年轻代的4/5。”

        “搞这么麻烦图啥呀?”一着急东北话说出来了。

        “就当是为了GC方便吧!”工作人员微笑欲言又止。

        “对了,刚一个对象跟我说他没死耶,那他几岁会死掉?”

        工作人员说:“这可要从三色标记算法说起,GCRoot也就是线程栈里方法引用对象为根结点向下遍历,如果所有引用都遍历到了标记为黑色,如果至少有一个没遍历到就是灰色,如果没有引用那就是白色。”

        不知怎么的,听见算法二字耳朵好像就会堵,后面说什么我没听清,但还是假装懂了迎合道:“果然不是非黑即白的世界。”似乎对象的存亡与年龄无关,与对他的引用有关。

        “我想去你们这豪华包间看一看!”我充满畅想的提出要求。

        没走几步,就到了old区,那个传说占了堆空间2/3的豪华包间。大失所望,Parallel Scavenge Old老年组围着一些老年对象,清除整理。无趣。

        我问到:“类加载器大哥去的那个方法区和这里也类似吗?你们这有没有刺激一点的地方?”

        工作人员摇摇头,引路带我去了线程栈空间。

        我参观着这里,有个八抓鱼一样的他叫程序计数器,还有一块专门区域牌匾写着“本地方法栈”看了看栈里的局部变量表、动态链接......咦?有个纸条,我拿起一看,上面写着:“出栈指令”,还没明白怎么回事,就被弹飞了,越飞越快速度惊人吓得我下意识闭上眼睛。

        再睁开眼,咦?

        

                

        

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员调优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值