为什么百度的源码查看不了_如何查看JVM的源码

还是说一下为什么会想着去看JVM的源码?
最近听说Kotlin支持协程非常强大,一千万个任务并发处理也没有问题,所有去实践的操作了一下。结果发现,kotlin在处理任务的时候还是创建了新的线程,这与我在理解的有点不一样「我一直以为适合golang的协程一样(听说一个是有栈协程,一个是无栈协程)」。

所以百度了一番,发现kotlin的协层类似与一种任务调度「将任务提交,然后kotlin_jvm里面有个线程池消费」(这里可以看一下这篇博客:Kotlin 协程真的比 Java 线程更高效吗?)。同时这个里面还说道了一个问题,如果基于现有的JVM,是无法实现类似与Golang那样的写成的。

ad05a335434d9e5a5bc23ee5c5141bad.png
图1:这个图说明了kotlin在启用切成的时候创建了新的线程

在有经过进过了一番百度,发现jvm的线程本质上就是os的线程,而且我看了好多博客,都翻出了jvm的源码来说的,这个时候我就心痒痒的,也想去看看....结果在第一次查找中,我在源码里迷路了,所以我就写下了这篇文章,记录一下如何去看。当然这个不会告诉你怎么去看,但是可以让你找到你需要的文件。(这是第一步)


这里先介绍了一下:我这里用的是jdk8u的源码,对应的 也就是jdk8u_jdk和jdk8u_hotspot

先介绍一下jdk8u_hotspot和jdk8u_jdk 是什么,刚开始我就在这个上面混淆了很久

简单的说吧:

  1. jdk8u_jdk 这个是openJDK的源码:JDK的源码以及JDK源码中native对应的c文件源码
    [这里也不是绝对,比如unsafe对应的c++文件就在jdk8u_hotspot中 unsafe.cpp,但是查找可以优先查这里]
  2. jdk8u_hotspot 这个就是JVM的源码,我们常用的是hotspot所以这个下载的是hotspot的源码。

如果我们需要查找一个文件:

以Thread.java来说:

1、第一步查看java文件,看看里面是不是有native方法。

886ef3d0fb95b37bb8f3bb9d80d8ee4a.png

8faafff21bedf373e557d8a59dc7b955.png
图3:其实这也就是我之前疑惑的答案所在

2、查找是否含有thread.c这个c文件,在jdk8u_jdk中

a02467e90c351978af9a2975a3bacc21.png
图4:java--->.c文件

这个时候我们可以看处理,每个native方法都对应的这个方法,这些方法都在jvm.cpp中,这个怎么知道的可以看一下这个

https://gorden5566.com/post/1025#%E8%A7%A3%E6%9E%90%E6%9C%AC%E5%9C%B0%E6%96%B9%E6%B3%95%E5%90%8D​gorden5566.com
10ed4560b5f31ecdf96914ef988cadc0.png
JNI入门之详细介绍 JNI入门之详细介绍​gorden5566.com
10ed4560b5f31ecdf96914ef988cadc0.png

3、这个时候我们知道真正执行的是那个方法了,这个方法是C++的,不在openJDK中,这个时候。这个时候我们将转移战场去hotspot中寻找。「这里我关心的是start0中的实现,所以我这里以start0为例对应的方法JVM_StartThread」

8b0274e7820a453ad4699a57b8c10c27.png

bfc97b9934d1b110fea563cf5f3f29c1.png
图6:这个时候我们就找到了我们的目标方法

这个大致就是去查看jvm的过程,接下来就是各凭本事了看不看得懂了。虽然看起来非常的简单,但是在我第一次查找的时候,真的迷路了,发现我为什么我和网上各位大佬写的路径完全不一样。。。。一脸懵逼。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值