可以通过运行jstat-gc(PID)命令在运行时查看元空间内存的使用情况
另外一个问题:
java应用程序的本机内存(Metaspace)是从堆内存获得空间,还是有一组完全不同的内存专用于它?
答:
Java堆空间
Java堆空间由Java运行时用来为对象和JRE类分配内存。每当我们创建任何对象时,它总是在堆空间中创建的。垃圾回收在堆内存上运行,以释放没有任何引用的对象所使用的内存。在堆空间中创建的任何对象都具有全局访问权限,并且可以从应用程序的任何位置引用。
Java堆栈内存
Java堆栈内存用于执行线程。它们包含特定于方法的短期值以及对堆中从该方法引用的其他对象的引用。堆栈内存总是以后进先出(后进先出)顺序引用。每当调用一个方法时,都会在堆栈内存中为该方法创建一个新的块来保存本地基元值和对方法中其他对象的引用。一旦方法结束,该块就变为未使用并可用于下一个方法。与堆内存相比,堆栈内存的大小非常小。
Java堆空间heap和堆栈内存stack的区别
堆内存由应用程序的所有部分使用,而堆栈内存仅由一个执行线程使用。
每当创建对象时,它总是存储在堆空间中,堆栈内存包含对它的引用。堆栈内存只包含本地基元变量和堆空间中对象的引用变量。
堆中存储的对象是全局可访问的,而堆栈内存则不能被其他线程访问。
堆栈中的内存管理是以后进先出的方式进行的,而在堆内存中则更复杂,因为它是全局使用的。堆内存分为年轻一代、老一代等,更多细节请看Java垃圾回收。
堆栈内存是短暂的,而堆内存从应用程序执行的开始一直持续到结束。
我们可以使用-Xms和-xmxjvm选项来定义堆内存的启动大小和最大大小。我们可以使用-Xss来定义堆栈内