简介引入:

        Java因为其使用虚拟机从而实现跨平台的功能。因为jvm由c++编写,在各种系统平台下都可以编译生成对应平台的jvm版本,而且这些jvm实现的功能一模一样,因此编写的Java代码文件在任意系统的虚拟机上都可以运行。

目录

1、JVM的本质

2、JVM的运行机理

3、Java代码解释器

4、类加器器线程

5、Java虚拟机jvm总结


1、JVM的本质

        JVM即Java虚拟机,其本质就是一个程序而已,与pycharm、vscode、CF等程序没有本质区别。或许jvm的复杂程度还没有LOL程序复杂。

2、JVM的运行机理

        以单进程为例,实际上jvm本身就是一个单进程的,但是其绝对是一个多线程的程序,因此需要使用频率更高的CPU才能让其跑的更快,比如全核心5.0Ghz的CPU。

        因此,jvm运行时,肯定有一个main线程(请注意这个main线程是C++的main线程),然后由这个main线程开辟其他线程,然后这些新开辟的线程肯定得归main线程管理才行。

        这些由main线程开辟的线程有:类加载器、代码解释器、程序计数器等。用于并发处理各种异步任务。

        Java中的内存区是相对来说的,是相对jvm来说存在栈区、堆区、方法区等。但是本质上还是用的jvm的在C++层面上的内存。比如:Java代码new出了一个对象,实际上这个对象是开在window系统上jvm进程所管理的内存上。所以可以认为:Java代码使用的堆区实际上就是jvm进程的堆区。

        再例如:Java代码开启了一个新线程,那也得从jvm的某个线程向平台系统再开一个线程才行。举个例子:windows下的jvm虚拟机,Java代码新开一个线程,那么jvm进程就会向Windows系统申请一个线程,然后再这个新的线程上运行Java代码的线程。

3、Java代码解释器

        Java同一些脚本语言类似,例如与python、javascript都需要代码解释器将代码编译为机器语言才能被电脑运行。虽然Java是强类型语言,也称为C--,但是其完全可以像C++那样搞一个编译器也能实现跨平台。

        同python一样,python的解释器是一个单线程程序,在解析代码脚本时是单线程的,而解析代码是整个代码运行的第一步,因此这里就成了一个瓶颈。实际上也无碍,跨过源代码解析这一步,就可以压榨CPU开始干活了。同时这里还存在编译缓存,下次就可以直接跨过源代码解析,但是也没人无聊到把一个项目开了关、关了开。

        Java类似,由于其源代码必须编译为机器语言,所以也需要面对源代码解析这一个致命问题。如何解析源代码是一个算法问题,如果深究这个,那就还需要规定编写Java代码时必须先写啥、后写啥来加速代码解析,其实不需要这么卷。

4、类加载器线程

        jvm一经运行,main线程就会开启类加器线程,用于加载class类文件、解析文件等操作,然后向这些线程共同管理的内存部分添加数据,例如方法体等。

        方法体存放的地方其实是jvm进程的内存区,调用这些方法时实际上是在jvm的某个线程基础上开始运行的。

        比如:jvm存在一个run线程(由main线程开启,专门用于新开栈区运行新的线程),那么Java代码的main线程肯定在run线程中被开启执行,直至整个Java项目运行起来。

        总结:类加载器线程会将类文件转换成可执行的Class对象,并将其加载到jvm进程的内存中,供程序在运行时使用,在这里可以使用反射技术,万事万物皆对象。

5、Java虚拟机jvm总结

        究其本质,jvm就是一个多线程程序,他的作用就是根据某套算法,将编写的Java源代码字符串运行起来。而jvm面对的问题其实也是如何设计内存模型、如何设计多线程、多线程之间如何共同管理内存等问题。同我们编写Java程序一样,只不过Java代码被限制于jvm的小世界当中。

        这个问题与浏览器类似:我们打开一个网站,也是同样的问题:如何将HTML字符串转换成网页,然后网页还可以响应事件。这里,可以把一个网页当作一个进程,进程也存在一个解析线程用于解析html文档,还有另一个线程用于运行js代码,本质上大同小异,但是实际使用C++实现起来却难如登天。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部