根据《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. SpringMVC学习记录七——sjon数据交互和拦截器

    21       json数据交互 21.1      为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservi ...

  2. asp.net 在repeater控件中加按钮

    在repeater中加入方法有两种方法: 第一种:是对repeater控件的行添加OnItemCommand事件,添加方法也是有两种 1.在设计页面中,选中repeater控件右击==>属性== ...

  3. autofac 注册

    1 注册的概念和方式 使用autofac 的ContainerBuilder 来注册组件(components---通常指实现类),并把它的服务(service---通常指接口,抽象类,类实例)暴露给 ...

  4. CSS实战3

    1. z-index  层级   div 层 <!DOCTYPE html> <html> <head lang="en"> <meta ...

  5. Spring-boot官方案例分析之log4j

    Spring-boot官方案例分析之log4j 运行单元测试分析: @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfigur ...

  6. 自己理解的数据库shcema

    不懂就被人嘲笑呀 ,你还不知道怎么说. 从定义中我们可以看出schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点 ...

  7. C#实现打印

    C#实现导出pdf文件,打印 using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  8. JDBC编程:获取数据库连接

    JDBC(Java Database Connectivity),即Java数据库连接.通过JDBC编程,可以使Java应用程序和数据库进行交互. JDBC驱动的方式有很多种,我们常用的驱动方式为:本 ...

  9. PP: 混合生产方式(MTO与MTS为例)(转)

    http://blog.sina.com.cn/s/blog_4c01b7650100yf1d.html PP: 混合生产方式(MTO与MTS为例) 一.业务概览某公司生产的同一种产品正常情况下客户无 ...

  10. git push之后回滚(撤销)代码

    问题描述:首先,先说明一下,为什么会引发这次的话题,是这样的,我做完功能Agit push之后,2个月后需求部门要求不要功能A了,然后需要在没有功能A的基础上开发,怎么办?赶紧回滚代码呀. 然后我用g ...