java应用程序的本机内存(Metaspace)是否从堆内存中获取空间,或者完全有一组专用于它的内存?
我认为它使用操作系统用来管理所有应用程序的内存,但不清楚。
答案 0 :(得分:0)
Java堆空间
Java运行时空间由Java运行时用于为Objects和JRE类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。垃圾收集在堆内存上运行,以释放没有任何引用的对象使用的内存。在堆空间中创建的任何对象都具有全局访问权限,可以从应用程序的任何位置引用。
Java堆栈内存
Java Stack内存用于执行线程。它们包含特定于方法的特定值,以及对从该方法引用的堆中其他对象的引用。堆栈存储器始终以LIFO(后进先出)顺序引用。每当调用一个方法时,都会在堆栈内存中创建一个新块,以便该方法保存本地原始值并引用该方法中的其他对象。方法结束后,块将变为未使用状态,并可用于下一个方法。与堆内存相比,堆栈内存大小非常小。
Java堆空间和堆栈内存之间的区别
堆内存由应用程序的所有部分使用,而堆栈内存仅由一个执行线程使用。
每当创建一个对象时,它总是存储在Heap空间中,而堆栈内存中包含对它的引用。堆栈内存仅包含本地原始变量和堆空间中对象的引用变量。
存储在堆中的对象是全局可访问的,而其他线程无法访问堆栈内存。
堆栈中的内存管理以LIFO方式完成,而在堆内存中则更复杂,因为它是全局使用的。堆内存分为Young-Generation,Old-Generation等,更多细节见Java Garbage Collection。
堆栈内存是短暂的,而堆内存从应用程序执行的开始到结束都存在。
我们可以使用-Xms和-Xmx JVM选项来定义堆内存的启动大小和最大大小。我们可以使用-Xss来定义堆栈内存大小。
当堆栈内存已满时,Java运行时抛出java.lang.StackOverFlowError
,而如果堆内存已满,则会引发java.lang.OutOfMemoryError: Java Heap Space
错误。
与堆内存相比,堆栈内存大小非常少。由于内存分配(LIFO)的简单性,与堆内存相比,堆栈内存非常快。
参考:
这是Java内存管理的基础,但通过参考资料应该给你全面的想法。
修改
感谢@rajvineet指出这篇关于how the JVM uses native memory on Windows and Linux的精彩文章。特别是how the Java runtime uses native memory部分清楚地描述了所有内容。