JVM基础和内存区域剖析

一、JVM的种类

  • Sun Classic VM

  • Exact VM(EMM 准确式)

  • HotSpot VM

  • JVM(Kilobyte)

  • JRockit

    • 号称世界上最快的JVM

    • JIT即时编译

    • JVM处于世界一流水平

  • J9

  • Azui VM

  • Liquid VM

  • Dalvik VM

  • Microsoft VM

二、JVM的结构

  • 类加载子系统

  • Java运行时数据区

  • 执行引擎

  • 本地方法接口

三、JVM运行时数据区

  • 线程共享

    • 方法区

  • 线程私有

    • 虚拟机栈

    • 本地方法栈

    • 程序计数器

image-20200702025222874.png

程序计数器(线程私有)

概念

一块较小的内存空间,当前线程所执行的字节码的行号指示器,包括分支、循环、跳转、异常处理、线程恢复等

特点

1.线程轮流切换CPU时间片后重新回到指令处理位置,故是线程私有的

2.唯一一个在Java虚拟机中不会出现OutOfMemeryError的区域

注:因为它只是当前线程执行的字节码的行号指示器

3.若线程执行的是Java方法,计数器记录的是正在执行的VM字节码指令地址,若执行的是Native方法,则计数器为空

4.与线程一起存在

虚拟机栈

先进后出

虚拟机栈:用户描述Java方法执行的内存模型

  • 调整参数:-Xss<size>

栈帧:虚拟机栈中的栈元素(用于支持虚拟机进行方法调用和方法执行的数据结构)包括局部变量表、操作数栈、动态链接、方法出口

  • 局部变量表:存放方法参数和方法内的局部变量

  • 操作数栈:虚拟机的工作区(大多数指令都是从这里弹出数据,执行运算,然后把结果压会操作数栈)

  • 动态连接:符号引用和直接引用在运行时进行解析和链接的过程,叫动态链接

  • 方法返回:程序正常完成出口和异常完成出口

image-20200702030821996.png

方法区(线程共享)[非堆-Non-Heap]

JDK1.8前后变化,JDK8取消了方法区,增加了元空间

image-20200702031716627.png

1.主要存储:

  • 类信息

  • 常量

  • 静态变量

  • 即时编译器编译信息

2.数据过多会导致OutOfMemoryError异常

< JDK 1.8

  • -XX:Permsize; -XX:MaxPermSize

>=JDK1.8

  • -XX:MeteSpaceSize; -XX:MaxMateSpaceSize

和永久代的区别:

1.存储位置不同,永久代物理上是堆的一部分,和新手代,老年代地址是连续的,而元空间属于本地内存;

2.存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中;

3.相当于永久代的数据被分到了堆和元空间中

直接内存:避免native空间和java堆中来回进行复制

  • 通过设置-XX:MaxDirectMemorySize限制大小

堆(线程共享)

image-20200702033412543.png

虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆

GC主要管理区域,可以通过-Xmx和Xms来设置最大和最小值,也可以通过-XX:NewSize -XX:MaxNewSize设置年轻代初始大小

超出空间大小会抛出OutOfMemoryError异常

新生区

新生区分为两个部分:伊甸区(Eden space)和幸存者区(survivor space)

伊甸区(Eden space)

大部分对象都会在Eden区诞生,并且一段时间不使用就会被GC回收

幸存者区(survivor space)

存在一段时间还在使用的对象会进入survivor区,survivor区包含一个相对的From区和to区,两者来回copy,回收没用的对象,用来延长对象的生命周期。

老年区(old FullGC)

经过多次GC仍然存在的对象会移动到老年区中,若老年区也满了,则会产生MajorGC(Full GC),对老年区进行内存清理(STW),若老年区执行了Full GC之后发现还是无法进行对象的报错,那么就会产生OOM异常”OutOfMemoryError“

虚拟机栈(线程私有)[VM Stack]

四、内存模型与回收策略

垃圾回收算法

1.标记-清除(Mark-Sweep)

问题:空间不连续,浪费空间


image-20200702035209179.png

复制(copying)

复制算法有2块一样大小的空间,情况对象时将可用的对象移动到to区里,复制算法内存空间连续

问题:要用2块空间,所以内存的模型from和to非常的小

image-20200702035446036.png

标记整理

只用一块空间,先进行标记无用对象,然后整理内存空间地址,最后清除

image-20200702035633349.png

五、垃圾收集器类型

串行搜集器(serial collector)

它只有一条GC线程,且就像前面说的,它在运行的时候需要暂停用户程序(stop the world)STW

并行搜集器(parallel collector)

它有多条GC线程,且它也需要暂停用户程序(stop the world)STW

并发搜集器(concurrent collector)

它有一条或多条GC线程,且它需要在部分阶段暂停用户程序(stop the world),部分阶段与用户程序并发执行

六、HotSpot中的垃圾收集器

串行搜集器的实现

serial(用于新生代,采用复制算法)、serial old(用于年老代,采用标记/整理算法)

并行收集器的实现

parNew(用于新生代,采用复制算法)、Parallel

Scavenge(用于新生代,采用复制算法)、Parallel

old(用于年老代,采用标记/整理算法)

并发搜集器的实现

concurrent mark sweep[CMS] (用于年老代,采用标记/清除算法)

七、收集器组合策略

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