导图社区 JVM内存结构
这是一篇关于JVM内存结构的思维导图,JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
这是一篇关于Mysql索引的思维导图,主要内容有为什么需要索引?索引的分类、如何避免回表查询?索引覆盖高性能索引策略。
对分布式的理解。基础概念:微服务是什么?集群&分布式&节点、远程调用;延伸概念:服务注册/发现&注册中心。
高效工作-整章的思维导图,以结果为导向、极致的关注,善于借助外部力量、小步快跑、试错迭代,让你的工作更加高效。
社区模板帮助中心,点此进入>>
安全教育的重要性
个人日常活动安排思维导图
西游记主要人物性格分析
17种头脑风暴法
如何令自己更快乐
头脑风暴法四个原则
思维导图
第二职业规划书
记一篇有颜又有料的笔记-by babe
伯赞学习技巧
JVM内存结构
运行时数据区
方法区
各个线程之间共享的区域,生命周期与JVM进程一致
它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
运行时常量
运行时常量池(Runtime Constant Pool)是方法区的一部分
Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放 到方法区的运行时常量池中
Java 语言并不要求常量一定只能在编译期产生,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String 类的intern() 方法。
内存回收
方法区的内存回收目标主要是针对常量池的回收和对类型的卸载
可能发生的异常
当方法区无法满足内存分配需求时,将抛出OutOfMemoryError
Java堆
是Java 虚拟机所管理的内存中最大的一块。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存
Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”, 如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法
新生代
Eden空间
From Survivor 空间
To Survivor 空间
老年代
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError
1)内存泄漏,可进一步通过工具查看泄漏对象到GC Roots 的引用链。 于是就能找到泄漏对象是通过怎样的路径与GC Roots 相关联并导致垃圾收集器 无法自动回收的。掌握了泄漏对象的类型信息,以及GC Roots 引用链的信息, 就可以比较准确地定位出泄漏代码的位置。
2)如果不存在泄漏,换句话说就是内存中的对象确实都还必须存活着, 那就应当检查虚拟机的堆参数(-Xmx 与-Xms),与机器物理内存对 比看是否还可以调大,从代码上检查是否存在某些对象生命周期过长、 持有状态时间过长的情况,尝试减少程序运行期的内存消耗。
线程共享,随JVM进程启动而创建,死亡而摧毁
程序计数器
当前线程所执行的字节码的行号指示器
如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地;如果正在执行native方法,则这个计数器的值为空
线程私有,每个线程有独立的计数器
很小的一块内存空间,唯一个Java虚拟机规范中没有规定任何OutOfMemoryError(OOM)情况的区域
Java栈
线程私有,每个线程有独立的Java栈,生命周期与线程一致
每个Java方法被执行时就会创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈动态连接、方法出口等,每一个方法被调用到执行完毕的过程,就是对应着一个栈帧在虚拟机栈中入栈到出栈的过程
局部变量表
存放编译期可知的各种基本数据类型(boolean、byte、 char、short、int、float、long、double)、对象引用
局部变量表所需的内存空间在编译期间完成分配, 当进入一个方法时,这个方法需要在帧中分配多 大的局部变量空间是完全确定的,在方法运行期间 不会改变局部变量表的大小。
如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError
如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存时抛出OutOfMemoryError(可能线程过多,申请内存超过了物理内存限制)
本地方法栈
为虚拟机使用到的Native 方法服务,有的虚拟机与Java栈合二为一了
可能发生的异常,与Java栈一致,StackOverflowError和OutOfMemoryError
线程私有,随线程启动而创建,死亡而摧毁
类装载子系统
执行引擎
本地方法库
其他语言的方法库,类似于dll注册后
本地直接内存