为啥好多方法java层面没实现?

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

main方法

我们大家都知道main方法是程序的入口,就像下面这个main方法一样,参数和返回值类型都不能变,那main方法是java虚拟机调用的嘛?这个问题我们来思考一下。

image.png

main方法没有调用,main线程我也没创建,那这main方法猜测是虚拟机帮忙调用的,但是main方法属于java层面的方法,我们也是可以调用的噢!

native方法

很多核心方法都是native实现,比如启动一个线程,如下的方法:

image.png

比如这个查看当前线程的方法,也没实现:

image.png

为啥这些方法java没实现呢?因为没办法实现,线程、内存的概念都是操作系统来的,java是一门高级语言,本身就不能创建线程和管理内存。JVM本身就不会操作java层面的语言来完成事情,因为它本身就是一个虚拟机,它还要和操作系统进行交互,真正调用的还是操作系统的指令。

那为啥要这么做嘞,因为这些东西java本身就没有,你写业务是java应用,但是和内存、cpu打交道的还是操作系统,你不可能业务用java来实现,然后线程又换成C++来实现,然后管理对象又是C++实现,这样管理起来太复杂,所以JVM把这个抽象了。

这个要特指是甲骨文的虚拟机-hotspot,热点虚拟机,为啥叫热点呢?这就要谈到虚拟机的历史了,主要是这款虚拟机能进行热点代码的检测,有人就说了:这有啥的,这就要涉及到解释执行即时编译,这款虚拟机呢可以通过执行计数器找到最有价值的代码,然后以方法为单位进行编译,这样就无需等待本地代码输出才能执行程序,在程序响应时间和性能之间取得了最优的平衡,就可以引用更复杂的代码优化技术,从而输出高质量代码。

猜你喜欢

转载自juejin.im/post/7128516081420861470