java的内存结构
来源:互联网 发布:锁 java 编辑:程序博客网 时间:2024/05/21 23:32
java的内存结构主要分为5个区域:
下面主要是说一下每个区域主要是干嘛的:
1.程序计数器
每个线程拥有一个PC寄存器
在线程创建的时候创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined
2.方法区 / 永久区
保持装载的类信息
类型的常量池(比如字符串常量池)
字段,方法的信息
方法字节码
在程序执行的时候调用某个方法,找该方法的代码就是在这里找
3.堆内存
应用系统对象保存在堆中(基本类型的实例变量也保存在堆中)
所有线程共享的区域
GC管理的主要区域
对于分代GC来说,堆也是分代的(分为新生代和老年代)
现在的GC基本都采用分代回收算法(在新生代使用Copying回收算法,在老年代使用标记压缩算法)
堆也是分代的,堆的空间是下面这个样子
4.栈
· 线程独享
·栈由一系列帧组成(因此Java栈也叫做帧栈)
· 帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
解释:
Java虚拟机栈描述的是Java方法执行的内存模型:每个方法被调用的时候都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机中从入栈到出栈的过程。
在java虚拟机规范中,对这个区域规定了两个异常情况:
(1)如果线程请求的栈深度太深,超出了虚拟机所允许的深度,就会出现StackOverFlowError(比如无限递归。因为每一层栈帧都占用一定空间,而 Xss 规定了栈的最大空间,超出这个值就会报错)
(2)虚拟机栈可以动态扩展,如果扩展到无法申请足够的内存空间,会出现OOM
4.1 Java栈之局部变量表:包含参数和局部变量
局部变量表存放了基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)。其中64位长度的long和double类型的数据会占用2个局部变量空间(slot),其余数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配。
例如,我写出下面这段代码:
public class F {//静态方法public static int m1(int i, long l, float f, Object o, byte b) {return 1;}//实例方法public int m2(char c, short s, boolean b) {return 1;}}
静态方法有5个形参,实例方法有3个形参。其对应的局部变量表为:
上面表格中,静态方法和实例方法 对应的 局部变量表 基本类似。但有以下区别: 实例方法的表中,第一个位置存放的是当前对象的引用
4.2java栈之 函数调用 组成栈帧:
方法每次被调用的时候都会创建一个栈帧,例如下面这个方法:
public static int runStatic(int i,long l,float f,Object o ,byte b){ return runStatic(i,l,f,o,b);}
当它每次被调用的时候,都会创建一个帧,方法调用结束后,帧出栈。如下图所示:
4.3java栈之 栈上分配
小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上
直接分配在栈上,可以自动回收,减轻GC压力
大对象或者逃逸对象无法栈上分配
- java的内存结构
- java的内存结构
- Java内存分配的结构
- Java内存划分的结构
- Java虚拟机的内存结构
- Java虚拟机的内存结构
- Java虚拟机的内存结构
- java类的结构的内存解析
- 黑马程序员-java的内存结构
- JAVA的内存模型及结构
- [精]JAVA数组的内存结构详解
- JAVA的内存模型及结构
- JVM初窥:Java对象的内存结构
- Java内存结构及参数的传递
- java内存结构
- java 内存结构
- JAVA程序内存结构
- Java虚拟机内存结构
- java数据结构
- devpress 的gridview 控件的行拖拽
- 母牛的故事
- 仿京东滑动页面搜索框背景渐变
- 怎么理解 IaaS、SaaS 和 PaaS 的区别?
- java的内存结构
- 干货|敏捷实践重构
- 程序员来做设计,世界会怎样?
- nginx无法启动
- Java Map 按Key排序和按Value排序
- 测鬼记(中)之奋斗——第一个项目
- Nginx的命令行控制
- 关于DecimalFormat数字格式化的基本使用
- 测鬼记(中)之奋斗——同是天涯沦落人