JVM培训:JVM内存模型组成

堆内存是Java虚拟机管理的内存中最大的存储区域。堆内存由所有线程共享。主要存储使用new关键字创建的对象。所有对象实例和数组必须在堆上分配。垃圾收集器根据GC算法收集堆上对象占用的内存空间(收集的是对象占用的空间而不是对象本身)。
  JVM堆分为新生代和老年代,新生代又分为Eden、SurvivorFrom区、SurvivorTo区,具体关系如下图:
  jvm培训

方法区
  方法区与Java堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。
  由于程序中的所有线程共享一个方法区域,因此必须访问该方法区域中的信息以确保线程安全。如果有两个线程同时加载一个类,则只允许一个线程加载该类,另一个线程必须等待。
  程序运行时,可以更改方法区域的大小,并且可以在运行时扩展程序。同时,方法区域中的对象也可以被垃圾收集,但是条件非常严格,并且必须由GC收集它们,而无需对该类进行任何引用。
  程序计数器
  在JVM的概念模型中,当字节码解释器工作时,它通过更改此计数器的值来选择要执行的下一个字节码指令。基本功能(例如分支,循环,跳转,异常处理和线程恢复)都需要依靠此计数器来完成。
  JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。
  当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址;如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空(Underfined)。
  程序计数器占用的内存空间很少,也是唯一一个在JVM规范中没有规定任何OutOfMemoryError(内存不足错误)的区域。
  Java虚拟机栈
  与程序计数器一样,Java虚拟机栈也是线程私有的,用通俗的话将它就是我们常常听说到堆栈中的那个“栈内存”。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(StackFrame)用于存储局部变量表(局部变量表需要的内存在编译期间就确定了所以在方法运行期间不会改变大小),操作数栈,动态链接,方法出口等信息。每一个方法从调用至出栈的过程,就对应着栈帧在虚拟机中从入栈到出栈的过程。
  本地方法栈
  主要用于存储本地方法的局部变量表,本地方法的操作数栈等信息。当栈内的数据在超出其作用域后,会被自动释放掉。本地方法栈是在程序调用或JVM调用本地方法接口(Native)时候启用。
  Java内存模型与硬件内存架构的关系如下图:
  JVM培训

相关推荐:【鲁班学院】java高级培训-能懂系列之Map详解
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值