理解JVM之JAVA运行时内存区域
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运行时内存区域的更多相关文章
- JVM发展史和Java运行时内存区域
目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...
- JVM笔记-运行时内存区域划分
1. 概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域.它们各有用途,有些随着虚拟机进程的启动一直存在(堆.方法区),有些则随着用户线程的启动和结束而建立 ...
- java运行时内存模式学习
学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...
- Java运行时内存
对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业.好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此, ...
- JVM学习笔记:Java运行时数据区域
JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...
- Java运行时数据区域分析
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结 ...
- 一. JVM发展史,运行时数据区域,四大引用
一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...
- Java运行时内存划分与垃圾回收--以及类加载机制基础
----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...
- Java运行时数据区域划分
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间.根据<Java虚拟机规范(Java SE 7版>的规定,J ...
随机推荐
- RVCT编译错误 Cannot obtain license for Compiler
找不到文件 找不到文件 Error: C9932E: Cannot obtain license for Compiler (feature compiler) with license versio ...
- 我的iOS动画01
1.嵌套使用,先变大再消失 [UIView animateWithDuration:1.25 aniamtions:^{ CGAffineTransform newTRansform = CGAffi ...
- markdown 测试博客发布
这是一个测试页面 无序列表 tet test 有序列表 特使团 tetst 引用 This is a test 插入图片 插入链接 baidu 粗体 这是粗体 斜体 这是斜体 表格 IP VIP 备注 ...
- sql的游标用法举例(Cursor)
sql的游标用法举例 ), ) Declare authors_cursor Cursor For Select Name,TrueName From Account Open authors_cur ...
- react中如何实现一个按钮的动态隐藏和显示(有效和失效)
初始准备工作 constructor(props) { super(props); /* * 构建导出数据的初始参数,结合用户下拉选择后动态设置参数值 * */ this.state = { btnS ...
- Python编译出现错误SyntaxError: Non-ASCII character '\xe7' 时解决方法
转载个解决办法:https://blog.csdn.net/wangchao701123/article/details/57084244 转自https://blog.csdn.net/jim742 ...
- iOS-二维码扫描界面(转)
网址学习:http://blog.csdn.net/linux_zkf/article/details/7724867 二维码扫描界面自定义 作者:朱克锋 邮箱:zhukefeng@iboxp ...
- laravel进程管理supervisor的简单说明
原文地址:https://www.cnblogs.com/zhoujinyi/p/6073705.html 背景: 项目中遇到有些脚本需要通过后台进程运行,保证不被异常中断,之前都是通过nohup.& ...
- php5.6安装及php-fpm优化配置
1,安装依赖包: yum install -y gcc gcc-c++ zlib zlib-devel pcre pcre-devel gd libjpeg libjpeg-devel libpn ...
- CCF201403 无线网络【限制型最短路】
问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上.任何两个无线路由器只要距离不超过 r 就能互相建立网络连接. 除此以外,另有 m 个可以摆放无线路由器的位置. ...