1.概述

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
java虚拟机所管理的内存包括以下几个运行的数据区域,如图

2.各区域描述

###### 1) 程序计数器 ######
程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器,字节码解释器工作时,就是通过改变这个计数器的值来选择下一条需要执行的字节码的指令,相当于汇编语言中的cs:ip。
java虚拟机的多线程是通过并发来实现的,所以在任何一个确定的时刻内,一个处理器只能够执行一条线程中的指令,所以为了保证线程的切换不会改变每一个线程执行的位置,每一条线程都有一个独立的程序计数器,即程序计数器是线程私有的。这个内存区域的生命周期就是线程的生命周期。
注意:如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native本地方法,那么这个计数器值为空(undefind)。

###### 2) java虚拟机栈 ######
java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法的内存模型:每个方法在执行时会创建一个栈帧,用于存储局部变量表,操作数栈等信息,每一个方法从调用到执行完成的过程就对应着一个栈帧从入栈到出栈的过程。
在虚拟机栈中,局部变量表是一个重要的部分,其存放了编译器可知的各种基本数据类型,对象引用类型,returnAddress类型(指向一条字节码指令的地址),局部标量表中的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。

###### 3) 本地方法栈 ######
本地方法栈与虚拟机栈十分相似,区别在于:虚拟机栈为虚拟机执行java方法(字节码)服务,本地方法栈为虚拟机使用到的Native方法服务。

###### 4) java堆 ######
一般而言,java堆(java heap)是虚拟机所管理的内存中最大的一块。java堆是被所有线程所共享的一块内存区域,在虚拟机启动时创建。其唯一的用于存放对象实例,几乎所有的对象实例都在这里分配内存。
java堆也是垃圾收集器管理的主要区域。从内存回收的角度看,java堆可以细分为新生代和老年代,也可在细致的分下去;从内存分配的角度看,线程共享的java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。
java堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可。

###### 5) 方法区 ######
方法区也是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编辑器编译后的代码等数据。·

###### 6) 运行时常量池 ######
运行时常量池是方法区的一部分。class文件中的常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。

###### 7) 直接内存 ######
直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但是这部分内存也会被频繁使用,可能导致OutOfMemoryError异常出现。

本博文完全参照《深入理解java虚拟机》(周志明),属于笔记整理。

java运行时的内存区域的更多相关文章

  1. Java运行时环境---内存划分

    背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对del ...

  2. JVM发展史和Java运行时内存区域

    目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...

  3. 理解JVM之JAVA运行时内存区域

    java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...

  4. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

  5. Java运行时内存

    对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业.好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此, ...

  6. Java运行时内存划分

    这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...

  7. 读书笔记:深入理解java虚拟机(一)虚拟机的运行时的数据区域

    最近在看深入了解java虚拟机第一版(周志明著),特此写读书笔记,整理其中重要的东西和自己的理解. ”java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却 ...

  8. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  9. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

随机推荐

  1. Linux select/poll和epoll实现机制对比

    关于这个话题,网上已经介绍的比较多,这里只是以流程图形式做一个简单明了的对比,方便区分. 一.select/poll实现机制 特点: 1.select/poll每次都需要重复传递全部的监听fd进来,涉 ...

  2. Windows环境和Linux环境下Redis主从复制配置

    Windows环境下和Linux环境下配置Redis主从复制基本上一样,都是更改配置文件.Windows环境下修改的配置文件是:redis.windows.conf.redis.windows-ser ...

  3. 【美食技术】家庭自制DIY鸡蛋饼和疙瘩汤早餐视频教程

    鸡蛋饼制作方法 食材准备面粉 150g鸡蛋饼  鸡蛋饼鸡蛋 2个盐 适量水 适量(约300ml)油 20g荵花适量也可根据自己喜好准备一些调味料. 做法 鸡蛋饼是一种家常点心,做法很多,这里提供3种. ...

  4. 5 Django-2 的路由层 (URLconf)

    URL 配置 (URLconf) 就像 Django 所支撑网站的目录.它的本质是 URL 与要为该 URL 调用的视图函数之间的映射表:你就是以这种方式告诉 Django,对于客户端发来的某个 UR ...

  5. 安装Oracle数据库时出现网络配置需求检查失败

    提示方法:将 Microsoft LoopBack Adapter 配置为系统的主网络适配器.  解决方法:  控制面板->添加硬件->是,(win7及之后没有添加硬件这个选项了,可以在c ...

  6. Linux 基础教程 39-作业控制

        在Linux系统中,作业是由一个或多个关联进程组成的.用户可以运行多个作业并可以在作业间切换.而作业控制则是对作业的行为进行控制,允许用户对作业的前后台的进行切换和终止操作等.作业相关的控制命 ...

  7. Delphi 文件拷贝

    function DoCopyDir(sDirName:String;sToDirName:String):Boolean;var hFindFile:Cardinal; t,tfile:String ...

  8. 原生JS实现随机点名项目

    核心思想 随机产生规定范围内的整数,然后再产生相同范围内的整数,两者相同时,则暂停. 所用知识 Math.random() * num: 产生从0到num的随机数 Math.floor(): 向下取整 ...

  9. mysql5.7 创建新表时提示时间戳非法

    # 背景 mysql版本5.7.8,需要创建新表,研发提供的sql文件,执行后报错如下: ERROR (): Invalid default value for 'deleted_at' 就猜测到时因 ...

  10. csv文件乱码

    问题描述: 生成的csv文件,设置为UTF-8格式,在windows上用EXCEL打开的话会乱码,在linux上用vim或者cat打开查看正常:设置为GBK格式的话,在windows上用EXCEL打开 ...