一篇文章带你领略——JVM运行原理揭秘

JVM运行时数据区

线程共享全部线程能访问这块内存数据,随虚拟机或GC而建立和销毁算法

线程独占每一个线程都会有它独立的空间,随线程生命周期而建立和销毁数组

线程安全问题:共享资源的抢占、线程共享的内存区域安全

方法区

方法区做用:存储加载的类信息、常量、静态变量、JIT编译后的代码等数据布局

GC:方法区存在垃圾回收,但回收效率低;回收主要针对常量池的回收。和类型的卸载;当方法区没法知足内存需求时,报OOM。spa

方法区属于Java虚拟机协议,好比Hotsport虚拟机是对其具体实现,实现的时候会去实现方法区,堆内存,垃圾回收GC,永久代是对方法区的实现,新生代,老年代对堆内存实现,jdk1.8就变了,以元数据来实现方法区。线程

堆内存

做用:惟一的目的就是存放对象实例,几乎全部对象、数组都是在这里存放3d

对于大多数应用来讲,堆是JVM管理的内存中最大的一块内存区域,也是最容易OOM的区域对象

大多数JVM都将堆实现为大小可扩展的(经过-Xmx、-Xms)控制blog

思考问题一:堆中存储了对象,那到底存储了什么?

Java对象在内存中的布局

思考问题二:对象什么时候被回收?

一、引用计数法(没法解决两个对象相互引用没法回收问题,致使内存泄露,JVM确定不回去使用这种方式)生命周期

二、可达性分析算法

主流的商用程序语言(Java、C#)都是经过可达性分析算法来断定对象是否存活的,

GC Roots能够是:一、虚拟机栈;二、方法中静态属性引用对象;三、方法区中常量引用对象;四、Native方法引用对象。

虚拟机栈

虚拟机栈:线程中方法执行的模型,每一个方法执行时,就会在虚拟机栈中建立一个栈帧,每一个方法从调用到执行的过程,就对应栈帧在虚拟机栈中从入栈到出栈过程。

Java线程本质是:从逻辑上来理解,开启一个Java线程,new Thread(()->{线程执行的业务代码})

main->show()->show1()->shou2()这样的调用链路,先进后出,就是,也就是表明虚拟机栈方法调用逻辑

虚拟机栈中的元素在逻辑上表明方法,表明方法的栈元素就叫作栈帧。

局部变量表

动态连接

方法里的局部变量并非一致存在,只有在方法调用的时候才会存在,只有在方法调用才会有方法入栈。

返回值地址

本地方法栈、直接内存

本地方法栈:和虚拟机栈功能相似,虚拟机栈是为虚拟机执行Java方法而准备,本地方法栈是为虚拟机使用Native本地方法而准备的。

直接内存:JVM以外的内存,开发人员本身分配内存

class文件结构

如今看下整个过程执行流程

切换上下文方式,程序计数器来跟踪。

相关文章
相关标签/搜索