Java虚拟机内存介绍

JAVA内存区域与内存溢出

概述

对于Java程序员来说,在虚拟机自动内存管理的机制下,不再需要为每一个new操作去写配对的delete和free代码。这样就不容易出现内存泄漏问题,由虚拟机来对内存进行管理。但是我们做为Java的开发者要了解虚拟机对我们内存的管理机制,这样有两个好处。一是在我们遇到一些虚拟机问题的时候我们可以直接的看出来原因。二是在写代码的时候尽量写成对虚拟机友好的代码。下面开始讲解在JAVA虚拟机内存的各个区域。
这里写图片描述

程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的的字节码的指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。
由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的,在任意一个确定的时刻,一个处理器都只会执行一个独立的程序计数器,各个计数器之间互不影响,独立储存,我们称这类内存区域为“线程私有”的内存。

Java虚拟机栈

与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程一样。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于储存局部变量表、操作数栈,动态链接、方法出口等信息。每一个方法从调用直至执行完成过程,就对应着一个栈帧在虚拟机里从入栈到出栈的过程。

本地方法栈

本地方法栈与虚拟机栈所发挥的作用类似,他们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,本地找是为虚拟机使用Native方法服务.

Java 堆

对于大多数应用来说,Java堆是java虚拟机所管理的最大的一块区域。Java堆是所有线程共享的区域,在虚拟机启动的时候创建,此区域的唯一目的就是存放java对象实例。几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的主要区域,因此很多时候被称为GC堆。

方法区

方法区与Java堆一样,是各个线程共享的内存区域,它被用于储存已被虚拟机加载的类信息,常量,静态常量,即使编译后的代码等数据。

运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分的内容在类加载后进入到方法区的运行时常量池中存放。

猜你喜欢

转载自blog.csdn.net/qq_24210767/article/details/78509549