Java中的内存管理 - 元空间/本机内存

时间:2016-12-29 06:10:20

标签: memory-management

java应用程序的本机内存(Metaspace)是否从堆内存中获取空间,或者完全有一组专用于它的内存?

我认为它使用操作系统用来管理所有应用程序的内存,但不清楚。

1 个答案:

答案 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部分清楚地描述了所有内容。