难怪我看不懂!call_stub竟然这么玄乎!

简介: 哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。

image.png

哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。

手撸过JVM、内存池、垃圾回收算法、synchronized、线程池、NIO...

erafbbd8u7.png

这样的硬核男人,怎么才能认识他?关注硬核子牙:

聊点啥

这篇文章想跟大家聊聊Hotspot源码的call_stub,如图

image.png

这啥?这篇文章目前还不适合你,默默关掉吧,我理解的!

为什么要聊这个?我又看不懂!(白眼)给我硬看!

这个问题是卷Hotspot的小伙伴问得比较多的,每次回答就像顺藤摸瓜一样,小伙伴们顺着我的回答抛出一堆问题,我怕了,写篇文章把讲透吧,后面谁来问,这篇文章丢过去。看不懂?多看几遍!

坦白讲,就这么一段代码,涉及到的知识点还真不少:

  1. 函数指针
  2. 变量定义花招

铺垫知识

先说宏,比较简单,就两个知识点:

  1. 宏定义,通过#define定义
  2. 宏展开,预处理阶段直接替换

打个比方

image.png

这是比较简单的,有的宏定义就像函数一样,还传参,把人搞疯了!万变不离其宗,无脑替换就可以了。

接下来谈谈函数指针,这个一两句话讲不清,我就举个例子了

image.png

总结一下:函数指针的强大就在于它可以用来定义函数,这个函数你给它什么地址,它就把那块内存当成函数执行

如果这样说你还是不懂,百度一下吧

好,最后一个铺垫知识:花样定义变量

image.png

OK,万事具备,开始卷。

顺便提一嘴,我在做手写JVM小班,就是以手写JVM为契机教大家底层如:汇编、C、C++、操作系统…底层最重要的不是视频,而是老师本人在你遇到问题的时候能指点你。如果你想学习底层,想成为技术大牛,来找我。

开始卷

点开call_stub,是一个函数,长这样,函数体是一个宏

image.png

找到宏定义

image.png

手动展开

image.png

继续展开

image.png

还有一个碍事的CallStub,继续展开

image.png

最终结果

image.png

_call_stub_entry是什么?是JVM调用Java函数的那座桥。指向一段内存,这段内存代码在这生成的

image.png

这个函数,还有一个:entry_point,是看懂Hotspot运行时的关键。然,这两座大山将99%的人拒之门外。

当然,不包括我,我用内联汇编模拟写了一遍

image.png

OK,就到这里,清晰明了。

我是子牙老师,喜欢钻研底层,深入研究Windows、Linux内核、JVM。如果你也喜欢研究底层,欢迎关注我的公众号【硬核子牙】

相关文章
new bind apply call instanceof 等笔记
new bind apply call instanceof 等笔记
37 0
|
5月前
|
缓存 NoSQL Java
15分钟面试被5连CALL,你扛得住么?
在Java并发编程中,锁是控制共享资源访问的关键,用于避免数据竞争、保证原子性、维护执行顺序、提高性能、实现同步及避免死锁。分布式锁在多节点系统中同样重要,确保一致性、防止资源冲突、提高可扩展性并解决竞态条件。实现分布式锁的方法包括基于数据库、缓存(如Redis)、Zookeeper等。选型时要考虑性能、可靠性、可扩展性和特定场景需求,如一致性、可用性和分区容忍性。
|
6月前
|
搜索推荐 Java
TODO有什么妙用
`TODO` 是Java开发中用于标记未完成功能或待修复问题的注解,能帮助追踪和管理开发任务。在代码中添加 `// TODO` 标记,如 `// TODO do something`,之后可通过搜索快速定位。IDEA还支持自定义`TODO`类型和颜色,以及全局查看和过滤器功能。阿里巴巴开发手册建议使用 `TODO` 表示待实现功能,`FIXME` 标记错误代码。推荐创建个性化代码模板以提高效率。
|
JavaScript 前端开发
面试官: call、apply和 bind有什么区别?
面试官: call、apply和 bind有什么区别?
|
程序员 C++
set_new_handler(0)是什么意思?有什么用?
set_new_handler(0)是什么意思?有什么用?
100 0
【UVM源码学习】uvm_object_globals
【UVM源码学习】uvm_object_globals
147 0
【UVM源码学习】uvm_object_globals
this和super用法的区别与细节(java继承中this和super的比较)
this和super用法的区别与细节(java继承中this和super的比较)
|
JavaScript
call, call.call, call.call.call, 你也许还不懂这疯狂的call
Function.prototype.call 我想大家都觉得自己很熟悉了,手写也没问题!! 你确认这个问题之前, 首先看看 三千文字,也没写好 Function.prototype.call,
168 0
call, call.call, call.call.call, 你也许还不懂这疯狂的call