1、运行时数据区域

  java虚拟机在执行java程序的过程中会将它管理的内存区域分为若干个不同的数据区域。这些区域有各自的服务对象,创建以及销毁时间,有的内存区域随着虚拟机的启动和关闭而创建和销毁,有的内存区域则依赖于用户线程的启动和结束而创建和销毁。

  java虚拟机管理的内存包含以下几个数据区域。如图所示。

1.1、程序计数器

  程序计数器是一块较小的内存区域,它可以看做是当前线程所执行字节码的行号指示器。由于java虚拟机的多线程工作是通过轮流切换线程并且分配处理器执行时间的方式来实现的,在任何时刻,处理器只会处理其中一个线程,所以在多线程轮流切换工作时,需要程序计数器来记住每个线程执行到的位置,这样在切换回当前线程时才能回到正确的位置,同时每个线程的程序计数器应该是互不影响,独立存储,所以程序计数器这部分内存区域是线程私有的。

1.2、虚拟机栈

  和程序计数器一样,虚拟机栈也是线程私有的。java虚拟机栈描述的是java方法执行的内存模型:每个方法执行过程中,会产生一个栈帧,栈帧存放的是局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的调用和执行完毕,对应着栈帧的入栈和出栈过程。

如下图所示:

局部变量表存放了编译期间可知的各种基本数据类型,引用类型和returnAddress类型。其中64为的long和double类型的数据会占用2个局部变量空间slot,其余额数据类型在1个slot。局部变量表所需要的内存空间在编译期间就已经确定了,当进入一个方法时,这个方法在帧中需要分配多大的局部变量空间已经确定的,在方法运行期间不会改变局部变量表的大小。

在java虚拟机规范中,规定了该区域会出现的两种异常:StackOverFlowError,如果线程请求的内存空间大于虚拟机所允许的内存大小,会抛出此异常;OutOfMemeoryError,如果虚拟机申请不到足够的内存是,就会抛出这个异常。

1.3、本地方法栈

  本地方法栈和虚拟栈很类型,区别就是虚拟机栈是为java方法服务的,而本地方法栈为Native方法服务的。

1.4、Java堆

  java对是虚拟机内存区域中最大的一块内存。java堆的目的是用来存放对象的。java堆也是垃圾收集器回收的主要区域。java堆可以处于物理上不连续的内存空间。如果在堆中没有内存完成对象的分配,并且堆也无法扩展时,会抛出OutOfMemeoryError。

1.5、方法区

  方法区和java堆一样,是线程共有的。它用于存储已被虚拟机加载的类信息、常量、静态变量和编译后的代码等信息。方法区是java堆的一部分。当方法区无法满足内存分配需求时,会抛出OutOfMemeoryError。

Java内存区域的更多相关文章

  1. 【转】Java内存管理:深入Java内存区域

    转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...

  2. Java 内存区域和GC机制分析

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  3. Java虚拟机2:Java内存区域及对象

    几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB,相邻 ...

  4. Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  5. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  6. Java 内存区域划分

            JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...

  7. Java内存管理:深入Java内存区域

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的皇帝 ...

  8. 2016021801 - Java内存区域学习笔记

    根据<深入理解java虚拟机>学习归纳整理学习笔记 程序计数器 用途:当前线程的字节码文件的行号指示器.(当前机场负责控制飞机降落的空管员:当前线程表示当前机场, 所执行的字节码等同于被等 ...

  9. Java 内存区域和GC机制--备用

    Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 ...

  10. JAVA内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

随机推荐

  1. adb获取不了设备List of devices attached

    方法/步骤: 首先找到手机的安装完之后的“设备的硬件id”,第一步右击我的电脑,然后找到设备管理器打开. 在设备管理器中,找到ADB driver然后点开. 然后在详细信息中,点开硬件ID,查看到我的 ...

  2. [GodLove]Wine93 Tarining Round #10

    比赛链接: http://www.bnuoj.com/v3/contest_show.php?cid=4159 题目来源: lrj训练指南---几何算法 Flag ID Title   A Board ...

  3. Quartz定时调度配置

    1.   CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...

  4. C++ 容器 LIST VECTOR erase

     在Vector中 做erase操作就是按照下面的步骤来做的: copy() destory(); 在list容器中 erase操作 destory() deallocate() Vector使用从某 ...

  5. system占用80端口的问题

    80端口被占用的问题 首先可以看看是不是iis占用了.如果是的话.修改为其他端口即可. 如果不是.. 在cmd中输入命令netstat -ano 查看是不是system占用了80端口? 如果是syst ...

  6. kernel/ptrace.c

    /* ptrace.c *//* By Ross Biro 1/23/92 *//* edited by Linus Torvalds */ #include <linux/head.h> ...

  7. [1]开发准备-使用C#.NET开发基于本地数据缓存的PC客户端

    小记:本人是PHPer,对C#.NET的开发只能说看得懂,也写得了功能略简单的PC客户端程序,下面的是本人开发一款名叫“理财速记”的PC客户端软件的全过程记录,期间包括比较繁琐的C#.NET资料查询等 ...

  8. Maven安装使用

    环境:Ubuntu 12.04LTS,jdk1.6 1.下载maven3.05: 2.解压并获取M2/bin/mvn地址: 3.创建~/.mavenrc文件,并加入JAVA_HOME并export(需 ...

  9. php部分---文件上传:错误处理、 客户端和服务器端的限制

    1.客户端页面 <!---客户端的配置 1.表单页面 2.表单发送方式为post 3.表单form中添加enctype="multipart/form-data" ----- ...

  10. HDU-2825 Wireless Password(AC自动机+状压DP)

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...