jvm之内存区域

来源:互联网 发布:在淘宝开店和天猫开店 编辑:程序博客网 时间:2024/05/29 18:58

运行时数据区域

运行时数据区域包括
1.方法区
2.堆
3.虚拟机栈
4.本地方法栈
5.堆
6.程序计数器

先从程序计数器,在我们曾经上的那个计算机原理课的时候就有一个小芯片叫程序计数器,它的作用就是加1。加1是什么意思呢,就是执行完一条语句后去执行下一条指令。jvm中的程序计数器可以理解为软件版的那个小芯片。
它占用一块较小的内存空间,它来负责指定下一条之字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖于它。
由jvm的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现 ,在任意时刻处理器都只会处理一条线程中的指令。为了线程切换后能恢复到正确的执行位置 ,每条线程都 需要有一个独立的程序计数器。它需要独立存储,这类内存区域为线程私有的内存。
(注意:如果正在执行的是Native方法,这个计数器的值 则为空,此内存区域是jvm规范中没有规定任何outofmemoryError的区域)

栈也是线程私有的,它的生命周期与线程相同。

栈描述的是java方法的内存模型:每个方法在运行时都会创建一个栈帧(方法运行时最基本的数据结构)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成的过程,就对应着一个栈帧从入栈到出栈的过程 。

堆是jvm所管理的内存中最大的一块。堆是被多线程共享的一块内存区域,在虚假机启动的时候,此内存区域唯一的目的就是存放对象实例和数组。几乎所有的对象都在这里分配内存。但随着技术的发展,栈上分配 、标量替换技术使它变得不那么绝对了。
堆里还有新生代还有老年代,新生代的gc比较频繁,老年代的则只能等待full gc。当新生代在几次gc时都没成功。则说明它还被调用,将会进入老年代,而有些大对象为了不影响gc效率,。则一“出生”就直接进入了老年代。

方法区

方法区与堆一样,都是多线程共享的区域,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。它号称永久代,甚至可以设置不进行垃圾回收。但正是由于管理宽松,它经常出现oom(outofmemory )的问题,在jdk1.7中已经把字符串常量池移出方法区了。

运行时常量池

它属于方法区的一部分,存放编译期生成的各种字面量和符号引用

直接内存

它可以看做是java堆和Native堆之间的一块缓存区域,通过 DirectByteBuffer对象对这块内存的引用 进行操作

0 0