您的位置:首页 > 编程语言 > Java开发

深入理解 Java 虚拟机-内存

2017-12-04 17:46 190 查看
1.内存区域分析



线程私有内存区:跟随线程的产生和消亡

程序计数器:一块较小的内存空间,它是当前线程所执行的字节码的行号指示器。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。

本地方法栈:保存栈引用指向java堆

Java 堆

Java Heap 是 Java 虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域。**几乎所有的对象实例和数组都在这类分配内存。**Java Heap 是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。

根据 Java 虚拟机规范的规定,Java 堆可以处在物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出 OutOfMemoryError 异常。



对内存分配情况分析最常见的示例便是对象实例化:

Object obj = new Object();

这段代码的执行会涉及 Java 栈、Java 堆、方法区三个最重要的内存区域。假设该语句出现在方法体中,及时对 JVM 虚拟机不了解的 Java 使用这,应该也知道 obj 会作为引用类型(reference)的数据保存在 Java 栈的本地变量表中,而会在 Java 堆中保存该引用的实例化对象,但可能并不知道,Java 堆中还必须包含能查找到此对象类型数据的地址信息(如对象类型、父类、实现的接口、方法等),这些类型数据则保存在方法区中。

3.StackOverflowError 和OutOfMemoryError

● StackOverflowError 代码中占用很多资源最后没有释放(栈中)

内存泄露是指分配出去的内存没有被回收回来,由于失去了对该内存区域的控制,因而造成了资源的浪费。Java 中一般不会产生内存泄露,因为有垃圾回收器自动回收垃圾,但这也不绝对,当我们 new 了对象,并保存了其引用,但是后面一直没用它,而垃圾回收器又不会去回收它,这边会造成内存泄露,

● OutOfMemoryError 内存耗尽物理机器的native memory不足,,申请更多资源时候申请不到,可能原因就是(StackOverflowError 太多资源被占用了)

内存溢出是指程序所需要的内存超出了系统所能分配的内存(包括动态扩展)的上限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: