/ 今日科技快讯 /
近日,美国证券交易委员会将百度、富途控股、爱奇艺、凯信远达医药和从事渔业养殖的Nocera加入“预摘牌名单”,这也是三月以来第三批被纳入名单的中概股。
/ 作者简介 /
本篇文章来自leobert-lan的投稿,文章主要分享了JVM内存模型和线程模型,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。
leobert-lan博客地址:
https://juejin.cn/user/54327/posts
/ 前言 /
各位亲爱的读者朋友,我正在创作 Java多线程系列 文章,严格的说,JVM内存模型的知识并不隶属于Java多线程范畴,但在讨论多线程的过程中,会涉及到相关概念,考虑到它作为 面试常客,故单独成篇进行知识梳理。
在各种有意无意地渲染之下,环境中已经充斥着焦虑,我并不认为正经面试真的有必要考察这些,毕竟没有几个岗位是开发JVM的。本篇文章将尽最大努力做到容易记忆,帮助各位克服焦虑!
在本篇中,将JVM内存模型以及JVM线程模型的关键知识,形成凝练的图、辅以文字,同读者一起 回顾并掌握 这些知识。
作者按:本篇按照自己有限的知识进行整理,如有谬误,还请读者在评论区不吝指出
先来看一张 较为完整 的图:
在右侧再补充GC部分后,就比较完整了。今天的文章中,类加载部分略去,GC部分略去。
作者按:读者朋友们还是应当将这两部分吃透的,如果面试遇到,可以顺着图展开作答
图中的 Java栈 又称为 Java虚拟机栈 、 虚拟机栈 、 JVM栈 等;本地栈 即 本地方法栈
/ JVM内存模型 /
从上图中,我们将运行时数据区剥出来,形成下图,即JVM内存模型 (内存区域):
在JVM1.8中,图中的 方法区 为 元数据区
在多线程背景下,我们应个景:
-
堆和方法区是 线程共享 的 -
虚拟机栈、本地方法栈、程序计数器是 线程隔离 的
-
Java6及之前:方法区存在永久代,保存有静态变量 -
Java7:进行去永久代工作,虽然还保留着,但静态常量池,如字符串常量池,已经移动到堆中 -
Java8:移除永久代,类型信息、域(Field)信息、方法(Method)信息存放在元数据区;字符串常量池、静态变量存放在堆区

-
局部变量表:保存函数 (即方法) 的局部变量 -
操作数栈:保存计算过程中的结果,即临时变量 -
动态链接:指向方法区的运行时常量池。字节码中的 方法调用指令 以常量池中指向方法的 符号引用 为参数。 -
方法的返回地址


-
新生成的对象在Eden区 -
触发 Minor GC后,还 "幸存" 的对象移动到S0 -
再次触发Minor GC后,S0和Eden 中存活的对象被移动到S1中,S0清空 -
每次移动时,自动递增计数器,超过默认值时 (印象中是16),移动到老年代,如果Eden中没有足够内存分配,也将直接在老年代中分配内存 -
老年代中依靠Major GC

-
使用内核线程实现 -
使用用户线程实现 -
使用用户线程加轻量级进程混合实现



版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qdvuejs/47414.html