jvm五大内存区域(即jvm运行时数据区),描述的是类被加载时,经过解析后,存储到特定的数据区。方法区和堆是所有线程共享的,而栈和计数器是线程私有的。栈处理程序运行的问题,堆处理数据的存储问题。所以才有堆栈分离。

方法区:又被称为永久代,用来存储类的信息,例如:方法,方法名,返回值,常量。当它无法满足内存分配需求时,方法区会抛出OutOfMemoryError。

堆:存放new出来的对象信息, 全局变量。

程序计数器:指向当前线程正在执行的行号,用来保证线程切换时回到程序调用的位置。(例如:在a方法里面掉用了b方法,代码从上往下执行,执行到掉用b方法的那行时,指针会记录下这个位置,然后执行b方法里面的逻辑,b方法正常执行完或异常退出,指针都会回到a方法里面。)

案例:我们这里可以写一个java文件,通过javac命令编译生成一个class文件,然后通过javap -l 命令查看程序的行号和局部变量表。

虚拟机栈:描述的是线程进栈出栈的过程,线程结束内存自动释放。它用来存储当前线程运行方法所需要的数据、指令、返回地址。(即局部变量和正在调用的方法)     方法被调用时会在栈中开辟一块叫栈帧的空间,方法运行在栈帧空间中。

先进后出:main方法先入栈,然后程序从上往下执行,a 和 b 相继入栈,程序执行完之后出栈,可以看到main方法最后执行完,所以栈是先进后出的。

public class Test {

    public static void main(String[] args) {
a();
System.out.println("main...");
} public static void a(){
b();
System.out.println("a...");
} public static void b(){
System.out.println("b...");
}
} ========== 控制台输出 =========== b...
a...
main...

栈帧的逻辑内存图里面包含局部变量表,操作数栈,动态链接,出口...(注意:栈帧里面包含但不仅仅只有这些, 程序员开发主要是关注这些 )。

public static void demo(){
/**
* 【局部变量表】 存放该方法的参数变量,和方法内部定义的局部变量,若该变量为引用类型,则存的该变量的引用地址。在java文件编译成.class文件的时候,这个表的容量最大值就确定下来了。
*/
String a = "局部变量a";
String b = "局部变量b";
int c = 2,d = 3; // 局部变量c和d
/**
* 【操作数栈】 也称为表达式栈,通过字节码指定把值压入栈定,稍后另一个指令就可以弹出这个值使用。
*/
int e = c*d; // 操作数栈
/**
* 【动态链接】 也称为常量池。用来保存常量值和符号引用。符号引用:A方法在运行时调用B方法,就是通过B方法的符号引用去找到B的内存地址.)
*/
UserDao dao = new UserDao();
dao.insert(a);
/**
* (出口):描述的就是出栈的过程。方法的返回有两种情况。(正常退出时:根据方法的定义来决定是否要传返回值给上层调用者。异常退出时:则是需要通过异常处理来确定。无论通过哪种方式退出,都会跳到当前方法被调用的位子。
*/
}

* 如果线程请求的栈深度⼤大于虚拟机所允许的深度,将抛出 StackOverflowError 异常

本地方法栈:和虚拟机栈类似,只是它描述的是为虚拟机是用到的Native方法出栈和入栈的过程(通常我们不需要了解这块,它底层是C语言实现的)。

一:jvm的五大内存区(内存结构)的更多相关文章

  1. JVM内存模型和结构详解(五大模型图解)

    JVM内存模型和Java内存模型都是面试的热点问题,名字看感觉都差不多,实际上他们之间差别还是挺大的. 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关@mi ...

  2. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

  3. JVM运行时数据区与JVM堆内存模型小结

    前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...

  4. jvm 虚拟机参数_方法区内存分配

    1.方法区( 永久区 ) 和堆一样,方法区是一块所有线程共享的区域,他用于保存系统类的信息.默认情况下 -XX:MaxPermSize 为 64m.如果系统运行时产生大量的类,就需要设置一个合适方法区 ...

  5. 你还在为了JVM而烦恼么?(内存结构和垃圾回收算法)

    ​ 做JAVA也有接近2年的时间了,公司的leader说,做JAVA,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了.恰逢辞职,来个JVM的解析可好? JVM是J ...

  6. JVM运行时数据区及对象在内存中初始化的过程

    JVM运行时数据区 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter R ...

  7. jvm对大对象分配内存的特殊处理(转)

    前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事 ...

  8. JAVA的内存模型及结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢? Java内存模型 Java内存模型在JVM ...

  9. JVM 系列(二)内存模型

    02 JVM 系列(二)内存模型 一.JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域.这些区域有各自的用途.创建/销毁时间: 一. 线程私有区域 线程私有数据区域生 ...

随机推荐

  1. 线程优先级队列( Queue)

    Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现 ...

  2. Pku2978 Colored stones

    题目链接:Click here Solution: 状压dp,考虑\(f[i][j][k]\)表示当前到了第i个石头,颜色状态为j,选取的最后一个石头颜色为k时能够留下的石头的最大数量 转移也很好转移 ...

  3. nbu还原集群数据库异常问题

    集群数据库软件均已安装完毕,现在想从NBU上还原数据库,但在还原控制文件报错 [oracle@oracle-db1 ~]$ rman target / Recovery Manager: Releas ...

  4. antd form表单一行多个组件并对其校验

    一行一个标签对应多个输入组件,这个需求很常见但在官方例子没看到合适的,因为官方建议: 注意:一个 Form.Item 建议只放一个被 getFieldDecorator 装饰过的 child,当有多个 ...

  5. java分页原理及分类

    1.使用List接口最终subList()方法实现分页 2.直接使用数据库SQL语句实现分页 3.使用hibernate等框架实现跨数据库的分页 mybatis是面向SQL的,本质上和第二种分页方式相 ...

  6. Spring boot 自定义一个starter pom

    用过springboot的自动配置会觉得非常方便,我们完全可以自己写一个starter pom,这样不仅可以有自动配置功能,而且具有更通用的的耦合度低的配置, 新建一个starter的maven项目, ...

  7. Unity Mathf And Transform Compent(一)

    Mathf类部分变量 辐射到度的转化函数,能够将弧度转化成度. Abs 能够求出绝对值 Atan 求出正切值x/y的弧度 Transform 组件中带有local 以父物体为坐标原点 global以世 ...

  8. 郝斌_GUI

    85事件处理 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java ...

  9. 调用user32.dll显示其他窗口

    /// 该函数设置由不同线程产生的窗口的显示状态 /// </summary> /// <param name="hWnd">窗口句柄</param& ...

  10. oracle-控制文件的备份和恢复

    本篇将介绍各种备份及恢复控制文件的方法,在介绍恢复时,以备份和重做日志(包括归档日志和在线日志)没有丢失为前提. 无备份情况下的控制文件恢复参考13.3,丢失重做日志的情况请参考12篇“不完全数据库恢 ...