JVM基础知识-内存结构

1.前言

本章开始学习JVM的基础知识,对于大部分开发人员来说,可能并没有花时间研究JVM的相关知识,但是他们也能完成一般程序的编写.如果我们了解JVM的相关知识,那么在代码编写,BUG调试,性能调优方面才能得心应手,不再是盲人摸象

2.目录

目录

3.JVM基础

3.1.内存结构

  • JVM分为5个区:虚拟机栈(VM Stack),本地方法栈(Native Method Stack),方法区(Method Area),堆(Heap),程序计数器(Program Counter Register)
  • 虚拟机栈,本地方法栈,线程计数器为线程私有,方法区和堆为线程共享区,并发访问时会阻塞
  • JVM不同区域占用的内存大小不同,一般情况下堆占用最大,存放的是对象,程序计数器最小
JVM内存结构

3.1.1.堆
堆里面存放是对象,几乎所有的对象实例都在此分配,随着优化技术的更新,某些数据也会被放在栈上.因为堆占用内存空间最大,堆也是Java垃圾回收的主要区域,因此也常称作"GC堆"(Garbage Collected Heap).有了GC就是相适应的策略,现代收集器基本都采用分代收集算法,堆被细化如下:

  • 堆的GC操作采用分带收集算法
  • 堆区分新生代和老年代
  • 新生代又分为:Eden空间,From Survivor(S0)空间,To Survivor(S1)空间

Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可.要增加堆空间时,只需完成逻辑上的扩,即可,但当堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常

3.1.2.方法区
方法区与堆都有线程共享,内存不连续可扩展,可垃圾回收,当无法再扩展时会抛出OutOfMemoryError异常等特性,Java虚拟机规范也把方法区描述为堆的一个逻辑部分,但目前实际上是与Java堆分开的(Non-Heap)

方法区存放的是已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的数据.方法区的内存回收主要目标是常量池和类型的卸载


方法区

3.1.3.程序计数器
程序计数器占用内存小,线程私有,唯一没有OutOfMemoryError的区域.其作用是当前程序所执行字节码的行号指示器,字节码解释器工作时通过计数器的值来选取下一条字节码指令,操作程序执行顺序,跳转,异常处理,线程恢复等基础功能

程序计数器

java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间来实现的,同一时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令.
程序计数器是私有的,这样才能恢复到正确的执行位置,各条线程之间的计数器互不影响,独立存储.执行Java方法是记录的是正在执行的虚拟机字节码指令的地址,执行Native方法计算器的值为空(Undefined)

3.1.4.虚拟机栈
虚拟机栈线程私有,生命周期与线程相同,每个方法执行都会创建一个栈帧(Stack Frame),栈帧用于虚拟机进行方法调用的数据结构,栈帧包含局部变量表,操作数栈,动态链接和方法返回地址等信息.每一个方法从调用至执行的过程,对应着一个栈帧在虚拟机从入栈到出栈的过程

虚拟机栈

  • 局部变量表(Local Variable Table):变量值的存储空间,存放方法参数和方法内定义的局部变量.包括8种基本数据类型,引用类型(reference类型)和returnAddress类型(指向一条字节码指令的地址)
  • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError,
    如果虚拟机动态扩展无法申请到足够的内存时会抛出OutOfMemoryError
  • 操作数栈(Operand Stack):也称操作栈,随着方法的执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈(入栈),再随着计算的进行,将栈中的元素出栈到局部变量表或者返回给方法的调用者()出栈
  • 动态链接(Dynamic Linking):每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,class文件的常量池中有大量的符号引用,字节码中方法的调用指令就以常量池中方法的符号引用为参数,这些符号引用一部分会在类加载阶段或者第一次使用的时候转化为直接引用(静态方法,私有方法),这种转化称为静态解析;另外一部分将在每一次运行期间转化为直接引用,这部分称为动态链接
  • 方法返回:无论方法是否正常完成,都需要返回到方法被调用的位置,程序才能继续进行

3.1.5.本地方法栈
与虚拟机栈作用相似,也会抛出StackOverflowError和OutOfMemoryError,区别在于虚拟机栈为虚拟机执行java方法服务,而本地方法栈视为Native方法服务

3.2.JDK8 JVM内存结构

堆和方法区的物理存储(方法区位于永久代中)
  • 堆和方法区是在同一块连续的内存,但是在逻辑上它们是分开的
  • HotSport将GC分代扩展至方法区,即用永久代(Permanent Generation)来实现方法区,其它虚拟机没有永久代的概念.方法区是规范,永久代是hotSport针对该规范的实现
  • 永久代和老年代是捆绑在一起的,无论谁满了,都将触发永久代和老年代的垃圾收集
JDK8内存结构
  • JDK8中,HotSport取消了永久代,取而代之的是元空间(MetaSpace),方法区存在于元空间,元空间不再与堆连续,而是存在于本地内存
  • 本地内存(Native Memory),也称C-Heap,供JVM自身进程使用,当Java Heap空间不足不足时会触发GC,C-Heap空间不足时却不会触发GC.默认情况下可以无限使用本地内存,可设置参数限制其使用
  • 使用元空间可由系统的实际可用空间来控制,不再由参数配置上限,减少了OOM的产生,且java8的HotSport就是以前的HotSport和JRockit的合并版,JRockit没有所谓的永久代

4.总结

本章讲解JVM的内存结构,对于数据的存储和运行有了简单的了解,知道了当虚拟机无法在扩展更多的内存,且不足以存储时会抛出OutOfMemoryError异常,当栈深度超过虚拟机分配给线程的栈的大小时会抛出StackOverflowError异常


参考博客:
https://www.zhihu.com/question/29265430
https://juejin.im/post/5da9446751882508866e960b
https://juejin.im/post/5dae7e5de51d45249850cf9f#heading-0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349