引自第3篇文章的一段:
java 虚拟机的实现,本身就是其他语言的一种实现,可以是C/C++ ,也可以是java ,也可以是javascript;
是其他语言实现的一种应用程序。
从Java 语言实现的角度上看,分配在stack中的数据,
而在虚拟机实现的角度上看,则可以分配在heap中
题主所说的来自JVM规范描述JVM Stacks的一段:
Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames,
frames may be heap allocated.
The memory for a Java Virtual Machine stack does not need to be contiguous.
规范规定得很松,留给实现非常大的选择空间。
要留意的重点就是,JVM作为实现层,它里面的很多数据结构都有“两面性”:
[ 被实现的语言的语义层面 | 实现语言层面 ]
用HotSpot VM举个简单的例子:
language semantics | implementation-level detail
|
java.lang.String (Java) <- [ ... ] -> instanceOopDesc (C++)
|
|
同一块内存区域,
对java 语言层面来说,它是一个String 类,有方法,有参数,可以用java 字节码对其进行操作;
对Hotspot VM 内部层面来说,这块内存是一个 C++ 的instanceOopDesc 对象,有指针,可以通过内存偏移量来操作其状态。
我们平台在对接设备的一些Java sdk时,Java sdk基本都是封装的对C/C++ 的操作,一方面,我们可以通过java 语言的语法,对一个java 对象进行操作;另一方面,可以通过指针,修改偏移量来操作这块内存的值和属性。
参考:
native memory和 native heap 及 GC heap有什么关系?
stack、heap 和 jvm stack、jvm heap区别?