jvm概念理解

每一个程序jvm都会为其分配一个jvm实例
每一个jvm实例有自己的堆,堆为一块内存区域,存放java对象
每一个线程有自己的栈(栈,本地方法栈 - 看虚拟机的实现),栈存放引用

堆是堆(heap),栈是栈(stack),堆栈是栈。我很不喜欢“堆栈”这种叫法,容易让新人掉坑里。

JVM里的“栈”(stack)存放基本类型的变量数据和对象的引用。但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。
同时JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。
这俩都是JVM规范所规定的概念上的东西,并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。以Oracle JDK / OpenJDK的HotSpot VM为例,它使用所谓的“mixed stack”——在同一个调用栈里存放Java方法的栈帧与native方法的栈帧,所以每个Java线程其实只有一个调用栈,融合了JVM规范的JVM栈与native方法栈这俩概念。

JVM里的“堆”(heap)特指用于存放Java对象的内存区域。所以根据这个定义,Java对象全部都在堆上。
要注意,这个“堆”并不是数据结构意义上的堆(Heap (data structure),一种有序的树),而是动态内存分配意义上的堆,一块用于管理动态生命周期的内存区域。

JVM的堆被同一个JVM实例中的所有Java线程共享。它通常由某种自动内存管理机制所管理,这种机制通常叫做“垃圾回收”(garbage collection,GC)。JVM规范并不强制要求JVM实现采用哪种GC算法。

JVM肯定是只有一个的。每个项目对应一个jvm实例,对应一个独立的进程。jvm实例间是完全隔离的,程序每次执行都会由jvm去执行!

上一篇:Spring Native 中文文档


下一篇:初识React Native——总结React Native与React的操作区别(1)