跟我一起学JVM(一)——Java虚拟机的内存结构

Java编程语言的特性就是兼容各种平台,这也是Java得到不断发展的重要因素之一。有没有人想过为什么会兼容呢?

在一开始接触Java的时候我们就需要安装Java virtual machine(JVM)以及JDK,平台兼容性的核心技术就在于JVM,因为Java程序是运行在JVM上,与操作系统之间的协调通信都是由JVM帮着完成的,所以只要由JVM的地方就能运行Java。

趁着假期打算出一个对于Java虚拟机知识点以及调优的专题(看完性能今天终于开始撸JVM了!!!)。JVM的很多数据都是默认配置好的,但是当我们真的在开发过程中,随着用户增多,系统压力增大,总会遇到一些OOM(out of memory)StackOverFlow,内存泄漏等线上问题,对于JVM的了解有助于我们诊断问题并作出相应的措施解决问题。

老规矩,先来一幅脑图理清学习的思路
在这里插入图片描述
本文主要聚焦于自动内存管理中虚拟机内存划分模块,后面的将随着我们学习的深入一点点进行完善。

Java虚拟机内存有几个部分组成
1.程序计数器
2.虚拟机栈
3.本地方法栈
4.方法区
5.Java堆

程序计数器其实就是一个指向内存的指针,用来取字节码的指令,相当于程序运行过程中的指南针。学过计算机组成与设计的同学知道程序指针PC就是指向存放指令的地方,使得程序按照指令规定的顺序进行执行,不然一堆jump跳转,branch分支指令肯定会让程序迷失方向,不知道自己运行到什么地方了。Java虚拟机内的程序计数器一个道理,它是线程私有的,每条独立线程都对应一个程序计数器,这样线程运行的时候才不会迷路。

虚拟机栈也是线程私有的,这也就意味着和程序计数器一样,生命周期与该线程的生命周期一样。如果该线程结束了,那么该线程对应的一切虚拟资源都将不复存在。虚拟机栈的作用就是存储该线程程序中局部变量表,操作数栈,方法的出口等信息。说白了就是用来存放程序在执行Java方法时所需存储的信息

本地方法栈,顾名思义就是用来存储执行本地方法时候需要存的信息的地方,因为Java的底层方法很多是用C/C++写的,也就牵扯到对于本机操作系统相关方法的调用,Java中的native关键字就是用来描述本地方法的。本地方法的源代码可以参照openJDK。

Java堆是JVM内存划分中比较重要的一环,因为它是内存划分中占空间最大的一块,也是被所有线程共享的区域。它的作用就是用来存放Java对象实例(在JVM老版本中,Java堆只用来存放Java对象,随着编译器优化,现在并不是所有的对象都在Java堆中创建了,但大部分对象依旧是存在于堆中的)

Java堆空间又被分为几个部分,大的方面可以分为两部分,分别是新生代(young)和老年代(old)(其实就是根据对象存在的时间长度来判断),往细致方面进一步区分的话,新生代又分为Eden(伊甸园), From Survivor, To Survivor,所以一个对象从Eden区域诞生,要进入到old需要经过所谓的“层层筛选”,从Eden到From Survivor,再到To Survivor,如果依旧存活才能进入old。能不能成为“天选之人”就看程序员为这个对象赋予了什么样的地位了,毕竟垃圾回收程序就像机器人一样到处巡视,如果有对象不被使用,那就要被清除,并释放所占用的内存空间供给其他对象使用,对象中只有真正的“强者”才能升级到old区域不被清除。Java堆就和操作系统中的虚拟内存一样,物理地址上可以不连续,只要逻辑上正确即可。

最后一块就是方法区了,它也是线程共享的内存区域,经常用来存储类的信息,常量,静态变量等,因为方法区主要存储的是类的一些基本信息,而不是对象,所以此处的垃圾回收(可以理解为内存空间回收)比较少见。大量的回收则是发生在Java堆空间。为了提高效率,方法区习惯性在程序运行的过程中加载程序所需常量信息,所以方法区中有一块区域为“运行时常量池”(存放常量的地方)。

今天的分享主要是剖析Java虚拟机的内存组成,脑图的其他部分将在后面几次分享中逐步完善,如果有不妥之处也希望大家指出,欢迎交流:)喜欢的别忘了三连,谢谢~


Instagram: https://www.instagram.com/barrywzc/
Twitter: https://twitter.com/BarryWa34098316
Bilibili: https://space.bilibili.com/473161964
GitHub: https://github.com/wzcwzcwzc
Patreon: https://www.patreon.com/wzcspace
微信公众号: wzcspace


Please leave a LIKE and SUBSCRIBE for more content!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值