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. #import和@class的使用

    #import          #import 大部分功能和#include是一样的,但是他处理了重复引用的问题,不用再去自己进行重复引用处理. @class         用于声明一个类,告诉编 ...

  2. 响应式图片srcset学习

    响应式图片srcset全新释义sizes属性w描述符 先转再看

  3. C/C++代码覆盖率生成

    初始状态下只有一个源代码文件 nosoul@linux:testCov> ls test.c nosoul@linux:testCov> 第一步:编译.链接.执行可执行文件 gcc -o ...

  4. [驱动开发] windbg符号表

    新建"环境变量 - 系统":_NT_SYMBOL_PATH 值为:SRV*FullDirPath*http://msdl.microsoft.com/download/symbol ...

  5. 关于OpenGL的绘制上下文

    什么是绘制上下文(Rendering Context) 初学OpenGL,打开红宝书,会告诉你OpenGL是个状态机,OpenGL采用了客户端-服务器模式,那时觉得好抽象,直到后来了解了绘制上下文才把 ...

  6. win32记事本程序(二)

    遇到一个较大的难题,做记事本要不要使用edit或者是richedit控件呢.如果用控件的话感觉没什么挑战,不用控件,现有的参考资料仅有<windows程序设计>第六章的TYPER程序,这个 ...

  7. NGUI 屏幕自适应

    雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表  现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少 ...

  8. ASCII电脑编码

    Bin Dec Hex 缩写/字符 解释 0000 0000 0 00 NUL(null) 空字符 0000 0001 1 01 SOH(start of headline) 标题开始 0000 00 ...

  9. MySQL字符串处理函数的几种常见用法

    1.字符串大小写转化: (1).将tbl_student表的user_name字段所有小写字母,替换为大写: update tbl_student set user_name=UPPER(user_n ...

  10. java程序链接到sql server数据库

    package jianhua; import java.sql.*; public class ConDatabase { public static void main(String[] args ...