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

1.程序计数器

  程序计数器(PC)是一块较小的内存,他是存储当前线程执行的字节码的行号指示器,可以类比硬件中PC,硬件中的PC用于指示当前程序执行的代码在内存中的内存地址.

2.JAVA虚拟机栈

  虚拟机栈描述的是JAVA方法执行的内存模型.每个方法在执行时都会创建一直栈帧用于存储局部变量表,操作数栈,动态链接,方法出口灯信息.每一个方法从调用到结束都对应一个栈帧在虚拟机栈中的入栈出栈.局部变量表存储的是编译期间可知的各种基本数据类型,对象引用和返回地址.基本数据类型有boolean,byte,char,short,int,float,long,double,其中boolean是1位,byte是8位即1个字节,char,short是16位即2个字节,float,int是32位即4个字节,long,double是64位即4个字节.在虚拟机栈中,64位的数据会占用两个局部变量空间,其他的只占用一个.

  在该区域有两个异常状况:如果线程请求的深度大于虚拟机允许的深度,会抛出StackOverflow异常,如果虚拟机栈可扩展,且扩展时无法申请到足够的内存会抛出OutOfMemoryError异常.

3.本地方法栈

  本地方发栈与虚拟机栈的作用非常相似,区别就在于前者执行的是本地方法,候着执行的是java方法.本地方法使用的语言,方式,数据结构没有强制规定,虚拟机可自由实现.

4.java堆

  该区域是用于存放对象实例的,几乎所有的对象实例以及数组都在这里分配..java堆是垃圾收集器管理的主要取悦,从内存回收的角度来看,由于现在收集器基本采用分代收集算法,所以java堆可分为:新生代和老年代.再细致一点分为Eden空间,From Survivor空间,To survivor空间等,从内存分配的角度看,线程共享的java堆可分出多个线程私有的分配缓冲区.无论如何划分,java堆始终存放的是对象实例.java堆是逻辑上连续的空间,就跟磁盘一样.关于这里提到的堆空间分区可以看下我的另一片关于java垃圾回收机制的博客.

5.方法区

  该区域用于存储虚拟机加载的类信息,常量,静态变量,及时编译器编译后额代码等数据.存储常量的区域我们可称为常量池.这个区域的回收主要针对于常量池以及类型的卸载.

6.运行时常量池

  这里额外介绍运行时常量池,它是方法区的一部分.class文件中除了有类的版本,字段,接口,方法等信息之外,还有一项是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池存放.运行时常量区是具备动态性的.该区域的常量不一定是编译器才产生的,运行期间新的常量也可以放入池中.这点特性利用的最多的就是String类的intern()方法.

理解JVM之JAVA运行时内存区域的更多相关文章

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

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

  2. JVM笔记-运行时内存区域划分

    1. 概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域.它们各有用途,有些随着虚拟机进程的启动一直存在(堆.方法区),有些则随着用户线程的启动和结束而建立 ...

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

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

  4. Java运行时内存

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

  5. JVM学习笔记:Java运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...

  6. Java运行时数据区域分析

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

  7. 一. JVM发展史,运行时数据区域,四大引用

    一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...

  8. Java运行时内存划分与垃圾回收--以及类加载机制基础

    ----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...

  9. Java运行时数据区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间.根据<Java虚拟机规范(Java SE 7版>的规定,J ...

随机推荐

  1. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_06-课程营销实战分析

    课程营销信息包括课程价格.课程有效期等信息. 课程营销信息使用course_market表存储. 接口我们要提供两个. 接口1先查询课程营销的信息,在页面展示. 接口2:叫做更新,如果发现数据不存在就 ...

  2. LeetCode_28. Implement strStr()

    28. Implement strStr() Easy Implement strStr(). Return the index of the first occurrence of needle i ...

  3. delphi字符串分隔函数用法实例

    这篇文章主要介绍了delphi字符串分隔函数用法,通过自定义函数SeparateTerms2实现将字符串分割后存入字符串列表的功能,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了delphi ...

  4. migrate设置

    migrate配置 进入项目manage所在的目录中执行如下命令,否则会报错:no such table: django_session 进入cmd 输入盘符比如:E: 切换目录 cd E:\prog ...

  5. 十六章 综合实例——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 pa ...

  6. 如何配置docker仓库

    创建文件 /etc/docker/daemon.json,写入国内镜像URL地址 { "registry-mirrors": [ "https://rq5uyt7.mir ...

  7. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  8. 教你成为全栈工程师(Full Stack Developer) 四十五-一文读懂hadoop、hbase、hive、spark分布式系统架构

    转载自http://www.shareditor.com/blogshow?blogId=96 机器学习.数据挖掘等各种大数据处理都离不开各种开源分布式系统,hadoop用于分布式存储和map-red ...

  9. eNSP——OSPF的基础配置

    原理: 模拟实验: 拓扑图: 实验编址: 1.基本配置 根据实验编址和拓扑图进行基本配置,并测试连通性. 2.部署OSPF网络 首先使用ospf命令创建并运行OSPF,1代表进程号 接着使用area命 ...

  10. 日常工作问题解决:使用vmvare克隆centos6虚拟机造成无eth0的解决办法

    目录 一.问题描述 样本虚拟机配置有两张网卡,eth0.eth1,使用vmvare克隆虚拟机后,复制的虚拟机,没有网卡eth0,eth1,而是有eth2.eth3,如下所示: 二.原因分析 复制系统中 ...