还是说一下为什么会想着去看JVM的源码?
最近听说Kotlin支持协程非常强大,一千万个任务并发处理也没有问题,所有去实践的操作了一下。结果发现,kotlin在处理任务的时候还是创建了新的线程,这与我在理解的有点不一样「我一直以为适合golang的协程一样(听说一个是有栈协程,一个是无栈协程)」。
所以百度了一番,发现kotlin的协层类似与一种任务调度「将任务提交,然后kotlin_jvm里面有个线程池消费」(这里可以看一下这篇博客:Kotlin 协程真的比 Java 线程更高效吗?)。同时这个里面还说道了一个问题,如果基于现有的JVM,是无法实现类似与Golang那样的写成的。
![ad05a335434d9e5a5bc23ee5c5141bad.png](https://i-blog.csdnimg.cn/blog_migrate/0af89b968ce8302f564f46e0f1edfada.jpeg)
在有经过进过了一番百度,发现jvm的线程本质上就是os的线程,而且我看了好多博客,都翻出了jvm的源码来说的,这个时候我就心痒痒的,也想去看看....结果在第一次查找中,我在源码里迷路了,所以我就写下了这篇文章,记录一下如何去看。当然这个不会告诉你怎么去看,但是可以让你找到你需要的文件。(这是第一步)
这里先介绍了一下:我这里用的是jdk8u的源码,对应的 也就是jdk8u_jdk和jdk8u_hotspot
先介绍一下jdk8u_hotspot和jdk8u_jdk 是什么,刚开始我就在这个上面混淆了很久
简单的说吧:
- jdk8u_jdk 这个是openJDK的源码:JDK的源码以及JDK源码中native对应的c文件源码
[这里也不是绝对,比如unsafe对应的c++文件就在jdk8u_hotspot中 unsafe.cpp,但是查找可以优先查这里] - jdk8u_hotspot 这个就是JVM的源码,我们常用的是hotspot所以这个下载的是hotspot的源码。
如果我们需要查找一个文件:
以Thread.java来说:
1、第一步查看java文件,看看里面是不是有native方法。
![886ef3d0fb95b37bb8f3bb9d80d8ee4a.png](https://i-blog.csdnimg.cn/blog_migrate/744be4e2a31908ad76769acda81ca157.png)
![8faafff21bedf373e557d8a59dc7b955.png](https://i-blog.csdnimg.cn/blog_migrate/50ecd98c1484286e61487b87ab1f7830.jpeg)
2、查找是否含有thread.c这个c文件,在jdk8u_jdk中
![a02467e90c351978af9a2975a3bacc21.png](https://i-blog.csdnimg.cn/blog_migrate/0af3b7f070ba4c0abd726cb9dfdb9d96.jpeg)
这个时候我们可以看处理,每个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%8Dgorden5566.com![10ed4560b5f31ecdf96914ef988cadc0.png](https://i-blog.csdnimg.cn/blog_migrate/40c19530c12febb2c0db51b57f3c2fda.png)
![10ed4560b5f31ecdf96914ef988cadc0.png](https://i-blog.csdnimg.cn/blog_migrate/40c19530c12febb2c0db51b57f3c2fda.png)
3、这个时候我们知道真正执行的是那个方法了,这个方法是C++的,不在openJDK中,这个时候。这个时候我们将转移战场去hotspot中寻找。「这里我关心的是start0中的实现,所以我这里以start0为例对应的方法JVM_StartThread」
![8b0274e7820a453ad4699a57b8c10c27.png](https://i-blog.csdnimg.cn/blog_migrate/768acadb539b260190b6dab753c81618.jpeg)
![bfc97b9934d1b110fea563cf5f3f29c1.png](https://i-blog.csdnimg.cn/blog_migrate/3854590958c6a692553c7dde74a81d4b.jpeg)
这个大致就是去查看jvm的过程,接下来就是各凭本事了看不看得懂了。虽然看起来非常的简单,但是在我第一次查找的时候,真的迷路了,发现我为什么我和网上各位大佬写的路径完全不一样。。。。一脸懵逼。