上次粗略介绍了下有关jvm的结构之类的
记得自己上课的时候老师画的草图
这张图自己的印象很深,特别是在解析递归的时候,现在回头看看,可能老师当时也是为了讲解让我们更加清晰,这个结构现在看的时候,是有一定的问题的。
闲话过去,今天我们主要来解析一个关键字native
首先我们想下我们运行一个线程的时候,是不是线程就马上启动了呢?可能这个问题对于像我这样刚来新手村打野升级的,肯定认为是的,那来一起看看源码吧
不知道大家看到了啥,我第一次进去的时候,第一眼看到的是synchonized这个关键字,我就在想效率这个问题,但是可能想错了,大家注意看我标的这三行代码,第一个给了一个标记started,标明是否开启线程,第一次进去都是fasle,证明都不是马上就启动的,再看第二行start0()这个方法,这是个什么方法呢?
我们可以看到是一个native的方法,这个我就翻译成本地方法,第三行就是启动了这个线程,将标记位置为true,从这个上面,可以看出两个问题,一个是线程不是调用了start()方法就马上启动的,第二个启动需要调用本地的方法,现在我们再来看这张图
右下角有个本地方法接口,这个本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,就必须交保护费,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法,在Execution Engine 执行时加载native libraies(本地方法库)。不过现在这用的越来越少了。
这个有个面试题:Student s = new Student() 这个s在哪里?首先会回答是在栈中,接着人家会问在哪个栈,如果我们没有学习jvm相关的知识,可能我们就会有点懵逼了,什么哪个栈啊 ?但是现在不一样,我们只要记住,带native的方法就会去本地方法栈,其余的都在java栈中,就像我上课老师画的哪个草图,大部分时候都说的是java栈。