Java 堆外、本机堆、直接内存和本机内存之间有什么区别?
最近,我在学习JVM内部结构时遇到了这些概念。我知道已经有很多关于他们个人的问题,但是我仍然不能理解他们之间的关系,或者仅仅是他们是什么 现在我这样描述他们:Java 堆外、本机堆、直接内存和本机内存之间有什么区别?,java,memory,jvm,Java,Memory,Jvm,最近,我在学习JVM内部结构时遇到了这些概念。我知道已经有很多关于他们个人的问题,但是我仍然不能理解他们之间的关系,或者仅仅是他们是什么 现在我这样描述他们: 本机内存表示正常JVM堆之外的内存区域,但仍在操作系统为JVM进程保留的总用户空间内存内(例如,在32位Windows上,默认为2GB)。JVM保留这个空间来存储一些内部数据,例如永久生成/方法区域等 直接内存表示通过java.nio.DirectByteBuffer使用本机内存 本机堆表示您通过不安全的方式使用本机内存。alloca
java.nio.DirectByteBuffer
使用本机内存
不安全的方式使用本机内存。allocateMemory
或在JNI代码中执行malloc
如果您需要超过2GB的内存,您真的应该使用64位操作系统和JVM。许多在JVM上运行的高性能服务器应用程序都使用堆外内存来提高服务器的性能,例如Apache Cassandra。它过去将大部分数据结构存储在堆上,但在最近的版本中,它一直存储在堆外内存上我真的很难理解java和OS提供的内存分段。既然操作系统将进程的地址空间划分为多个段(如堆堆栈数据文本),那么JVM进程内存也将由操作系统提供这些段。现在,当JVM开始执行JAVA程序时,它(JVM)再次提供类似于JAVA程序的分段。现在我真的把这两种类型的内存分割搞糊涂了,它们是由OS提供的,然后由JVM提供给java程序。你能帮我理解这一点吗。