java内存区域与内存溢出异常

来源:互联网 发布:摇一摇截图软件大全 编辑:程序博客网 时间:2024/04/30 05:18

1.java运行时数据区图
这里写图片描述

2.程序计数器
线程私有内存。是当前线程所执行的字节码的行号指示器。简单来说:在一个确定时刻,处理器只会执行一条线程中的指令,为了线程切换后能恢复到正确的执行位置,每条线程就会需要独立的程序计数器来存储执行位置等。
如果线程正在执行一个java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,则计数器为空。

3.java虚拟机栈
线程私有内存。生命周期与线程相同,每个方法执行时会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。

4.本地方法栈
与虚拟机栈类似,只不过虚拟机栈服务的是java方法,本地方法栈服务的是native方法。

5.java堆
线程共享内存。目的就是存放对象及数组。是垃圾收集的主要区域,内存物理上不一定是连续的,里面的详细划分见后续文章…

6.方法区
线程共享内存。存储已被虚拟机加载的类信息,常量,静态变量,及时编译器后的代码等数据。这里很少进行垃圾回收,一旦回收目标主要是针对常量池和类的卸载。

7.直接内存
上图没画出来是因为这个并不是虚拟机运行时数据区的一部分,它是使用native函数直接分配堆外内存,java nio中DirectByteBuffer就是直接内存。这样避免了在java堆和native堆中来回复制数据。
今天先到这,后续在分析虚拟机知识。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400

0 0
原创粉丝点击