根据《java虚拟机规范第二版》规定,现阶段的java内存区域总体如下图

其中,方法区和堆是所有线程共享区域。 虚拟机栈,本地方法栈,程序计数器是各线程独占。


概述一下各个区域

先说说线程私有的几个区域:

1.程序计数器

1.当前线程所执行的字节码的行号指示器,通过改变这个计数器的值来选取下一条需要执行的指令。由于java虚拟机多线程通过线程切换轮流执行,所以为了线程切换以后能恢复到正确的位置开始执行,所以每一条线程都有自己的程序计数器。
2.其中:如果当前线程执行的是java方法,那么记录器记录的是虚拟机字节码指令的地址,如果是native方法,那么这个值为空。
3.它是java虚拟机规范中唯一一个没有定义OutOfMemoryError情况的区域。

2.java虚拟机栈

1.每个方法执行时都会同时创建一个帧栈,用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用直至执行完成的过程,就对应一个帧栈在虚拟机中从入栈到出栈的过程。
2.常说的“堆栈”中的栈就是指java虚拟机栈中的局部变量表部分。
3.局部变量表中存储的是基本类型,对象引用(句柄,或者引用指针),和returnAddress。64为的long和double会占用2个局部变量空间slot。其余占用1个。局部变量所需的内存空间在编译器的时候完成,当进入一> 个方法时,这个方法在帧中占用多少空间是完全确定的。在方法运行期间不会改变局部变量表的大小。

异常:

  • 1.当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError。
  • 2.当虚拟机栈可以动态扩展,无法申请到足够的内存时就会抛出OutOfMemoryError。
3.本地方法栈

作用和虚拟机栈类似,区别在于本地方法栈是为native方法服务的,由虚拟机自行实现,有些虚拟机如sun hotspot将本地方法栈和虚拟机栈合并。他也会抛出异常。


线程共享的区域:

1.java堆

唯一目的就是存储对象实例
java虚拟机规范:java堆可以处于物理不连续的内存中,只要逻辑上市连续的即可。

2.方法区(non-heap)

存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。属于堆的一个逻辑部分,为了便于区分,别名:non-heap
该内存也存在内存回收机制。
运行常量池: 方法区的一部分,用于存储编译时生成的字面量和符号引用。运行期间也可能将新的常量放入池中,常用的有string.Intern();


另外说一个不属于java内存区域内的:直接内存
JDK1.4加入的nio采用native方法直接操作本机内存。然后再java堆里面创建一个directbytebuffer对象作为这块内存的引用。但是如果使用不当,会使得堆外内存超过物理内存而导致内存溢出。

另外说说对象的访问
主流的有两种,分别是句柄和指针。

JAVA虚拟机(一):内存区域的更多相关文章

  1. 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制

    一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...

  2. 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))

    java虚拟机的内存区域分配   在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...

  3. Java虚拟机之内存区域

    原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 ...

  4. Java虚拟机各内存区域的位置及功能的介绍

    Java虚拟机运行时数据区: 相关区域介绍: 程序计数器: 功能:当前线程所执行字节码的行号指示器.若是Java方法记录指令地址,若为Native方法,则不记录 隔离性:线程隔离 Error:无 Ja ...

  5. 深入理解Java虚拟机02--Java内存区域与内存溢出异常

    一.概述 我们在进行 Java 开发的时候,很少关心 Java 的内存分配等等,因为这些活都让 JVM 给我们做了.不仅自动给我们分配内存,还有自动的回收无需再占用的内存空间,以腾出内存供其他人使用. ...

  6. Java虚拟机------JVM内存区域

    JVM内存区域运行时数据区域分为两种: JVM内存区域 运行时数据区域分为两种: 线程隔离的数据区: 程序计数器 Java虚拟机栈 本地方法栈 所有线程程共享的数据区: Java堆 方法区 JVM 内 ...

  7. 深入Java虚拟机之内存区域与内存溢出

    一.内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方 ...

  8. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  9. 深入理解java虚拟机【内存溢出实例】

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

  10. Java虚拟机:内存模型详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...

随机推荐

  1. js学习笔记-数字转罗马数字

    function convert(num) {     var ans = "";     var k = Math.floor(num / 1000);     var h = ...

  2. Cesium.js隐藏logo等信息

    css: .cesium-widget-credits{ display:none!important;}js: var viewer = new Cesium.Viewer('cs', { anim ...

  3. 【luogu P4113 [HEOI2012]采花】 假题解

    题目链接:https://www.luogu.org/problemnew/show/P4113 为什么要卡莫队!为什么加强的这么毒瘤! 莫队可以拿100分剩下三个点没治了 // luogu-judg ...

  4. WebStorm中Node.js项目配置教程——项目设置

    上一章讲解了Node.js项目在WebStorm中的两种创建方式,当完成Node.js项目创建以后,剩下的就是涉及配置设置工作. 为了确保Node.js全局和Node.js核心模块的代码完成功能,打开 ...

  5. AngularJS表格排序

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. SpringBoot非官方教程 | 第十三篇:springboot集成spring cache

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot13-springcache/ 本文出自方志朋的博 ...

  7. iOS之UIKeyboardType 11种键盘图片展示

    UIKeyboardTypeDefault      UIKeyboardTypeASCIICapable  ==  UIKeyboardTypeAlphabet      UIKeyboardTyp ...

  8. Struts2知识点小结(四)--拦截器与注解开发

    一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...

  9. code ELIFECYCLE (代码周期)

    问题:build 不成功 解决:新建一个dist 文件,没有自动新建dist 文件 问题 :npm run dev 时候 解决:

  10. ETO的公开赛T5《猎杀蓝色空间号》题解

    这道题别看题面这么长,其实题意很简单 就是让你求从起点开始的最长合法区间 合法的要求有两个:兜圈子和直飞 且这两个条件相互独立 (也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响) 举个例子: 1 ...