在C++中,程序员拥有每一个对象的所有权,但与此同时还肩负着释放对象内存空间的责任;而Java由于有了虚拟机的帮助,程序员拥有对象的所有权的同时不再需要释放对象的内存空间。由于是JVM自动进行对象内存的释放,所以内存泄漏和内存溢出的问题也很少出现。
Java虚拟机在运行时将内存空间分成5个部分,分别是:方法区、虚拟机栈、本地方法栈、堆、程序计数器。
本地方法栈的特性和JVM栈的特性几乎一样,只不过JVM栈中存放的是Java方法的相关信息,而本地方法栈中存放的是本地方法的相关信息。 本地方法栈也会抛出OutOfMemoryError和StackOverFlow异常。
直接内存不是JVM规范中定义的内存区域,但在JVM的实际运行过程中会频繁地使用这块区域。而且也会导致OutOfMemoryError异常。 在JDK 1.4中新加入了NIO=New Input/Output类,引入了一种基于通道和缓冲区的IO方式,它可以使用本地函数直接分配堆外内存,然后通过一个存储在堆里的DirectByteBuffer对象作为这块内存的引用来操作堆外内存中的数据。这样能在一些场景中显著提升性能,因为避免了在Java堆和Native堆中来回复制数据。 直接内存不受Java堆大小的限制,但仍然受本机总内存的限制。