一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程
JVM之内存结构详解
JVM内存结构
java虚拟机在执行程序的过程中会将内存划分为不同的区域,具体如图1-1所示.
五个区域
JVM分为五个区域:堆、虚拟机栈、本地方法栈、方法区(元空间)、程序计数器
PS: 1.五个区域中,虚拟机栈、本地方法栈、程序计数器为线程私有、方法区和堆为线程共享区; 2.JVM中不同区域的占用大小不同,堆最大,程序计数器最小,Java中最多的“对象”就是放在堆中
堆
堆得主要作用就是存储对象,它占用最大的内存空间堆区,也同样成为了java垃圾收集器的重要对象。因此也被称为“GC堆”。堆是jvm所有线程共有的。
图1-1-1
由于垃圾收集器GC采用分代收集算法,所以堆内存中也分成了 2/3年轻代,1/3老年代 。如图1-1-1所示。
关于JAVA垃圾收集器GC分代的概念:
JVM 内置的通用垃圾回收原则,堆内存划分为 Eden、Survivor 和 Tenured/Old 空间bai。GC一共分三种:MinorGC,Major GC v和Full GC。Full GC是清理整个堆空间—包括年轻代和永久代。有时候系统会频繁的FullGC,这时候需要去服务器查一下原因。
新生成的对象首先放到年轻代Eden区,当Eden空间满了,触发Minor GC,存活下来的对象移动到Survivor0区,Survivor0区满后触发执行Minor GC,Survivor0区存活对象移动到Suvivor1区,这样保证了一段时间内总有一个survivor区为空。经过多次Minor GC仍然存活的对象移动到老年代。老年代存储长期存活的对象,占满时会触发Major GC=Full GC,GC期间会停止所有线程等待GC完成,所以对响应要求高的应用尽量减少发生Major GC,避免响应超时。 Minor GC : 清理年轻代 Major GC : 清理老年代 Full GC : 清理整个堆空间,包括年轻代和永久代 所有GC都会停止应用所有线程。
关于新生代到老年代的规则:
如图1-1-2所示:
1.minorgc回收整个年轻带,挪一次分代年龄+1,长期存活的对象分代年龄达到15到老年代。或者survior满了会触发minorGC会自动到达老年代。
2.一批对象如果大于surviovr区域百分之五十直接进入老年代
3.为了避免大对象分分配内存是需要复制大对象会直接进入老年代
图1-1-2
JVMGC内部采用可达性分析算法回收对象,具体规则如图1-1-3所示,可达性算法是将“GC Roots”作为起点,搜索引用的对象,搜索到的对象打上标记。未搜索的标记为非垃圾对象。
图1-1-3
Java虚拟机栈
虚拟机栈中存储的是方法,栈中的数据都是以栈帧的格式存在,我们简称栈帧,栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。java虚拟机栈是线程私有的,它的生命周期是和线程一样。每个线程在创建的时候都会创建一个虚拟机栈。但是而在栈帧中分为操作数栈,局部变量,动态链接,返回地址等。
ps:1.每一个栈帧遵循先进后出后进先出的出栈入栈规则。
2.操作数栈:从局部变量中或者对象实例中复制常量或者变量到操作数栈,在随着计算将栈中元素出栈到局部变量或者返给方法调用者。通俗来说,就是传递参数的。
3.动态链接,每一个栈帧都会有一个指向运行时常量池(运行时常量池是在JVm在运行加载类的时候,把class文件里的常量放到运行时常量里。一个类对应一个运行时常量池)的引用,来支持方法与方法之间的调用。字节码中的方法调用指令就以常量池中方法的符号引用为参数。
4.局部变量中的对象指针指向堆
本地方法栈
首先,什么是本地方法呢?JVM中的本地方法是指java带有修饰符native的方法,但是方法体不是用java写的。这一类方法被称为java本地方法。这类方法的存在的意义是为了弥补java代码不方便实现的缺陷而提出的。
本地方法栈,作用与java虚拟机栈类似。 区别是:虚拟机栈为虚拟机执行java方法服务,而本地方法是为native方法服务。
本地方法栈是线程私有的。它的生命周期与线程相同,每个线程只有一个。
方法区(元空间)
1.线程共享。在虚拟机启动时候创建,所有jvm线程共享。
2.上文所提到的运行时常量池就是方法区的一部分。
3.被装载的class文件的信息存储在方法区中的运行时常量池中,他使用类装载器定义相应的class文件
4.用于存在已被虚拟机加载的类信息,常量,变量,静态变量
程序员写的代码其实在在jvm虚拟机中被转成了一条条指令集执行的。如下图。
图5-1
程序计数器
程序计数器也叫PC寄存器,是一块内存空间,如果将class文件进行反编译后,就能看到一条条的指令集,如图5-1动图所示,PC代表的就是程序计数器的计数。
他可以看作是线程所执行的字节码的行号指示器,在虚拟机中,字节码解释器工作时,就是根据程序计数器的值来选取下一条需要执行的指令。分支、循环、异常处理、跳转都是需要这个程序计数器来完成。当虚拟机正在执行一个本地方法也就是native方法时,程序计数器存储的值是undefined。程序计数器是私有的。它的生命周期与线程相同,每个线程都有一个。
JAVA程序执行顺序:
1.加载主方法的class文件进入方法区,方法区加载类的信息。
2.执行程序后,方法区的方法入栈,栈给方法分配栈帧。
3.遇到new对象的情况就在堆中开辟这个类的实例空间
arthas:查看cpu,jvm调优工具
JVMGC垃圾收集器:在底层执行的时候,会停掉所有线程(stop the world 简称STW),尽量的减少full gc.
面试:1.为什么要设计STW?
2.能否对jVM调优,让其几乎不发生Full Gc
一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程的更多相关文章
- PowerShell攻防进阶篇:nishang工具用法详解
PowerShell攻防进阶篇:nishang工具用法详解 导语:nishang,PowerShell下并肩Empire,Powersploit的神器. 开始之前,先放出个下载地址! 下载地址:htt ...
- 精讲RestTemplate第4篇-POST请求方法使用详解
本文是精讲RestTemplate第4篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...
- [转]JVM指令详解(上)
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码 助记符 ...
- JVM内存详解-阅读笔记
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
- JVM结构详解
JVM 结构详解 JVM 结构图 程序计数器(PC 寄存器) 程序计数器的定义 程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址.若当前线程正在执行的是一个本地方法,那么此时程 ...
- 框架基础学习之--详解web+maven+spring+mybatis+struts框架文件夹作用
详解web+maven+spring+mybatis+struts框架文件夹作用 1.程序名 2.Mybatis,mybatis是数据持久层,就是和对象类有关系的东西 3.存放java文件,xml,p ...
- 想真正了解JAVA设计模式看着一篇就够了。 详解+代码实例
Java 设计模式 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结 设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类.分别是创建型模式.结构型模式和行为型模式 列举几种设 ...
- 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解
今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...
随机推荐
- Chapter Zero 0.1.3 其他单元设备以及运作流程
其他单元设备 五大单元中的控制单元.算数逻辑段元都被整合到CPU的封装中, 但其实系统单元中,不止有CPU(控制单元.算数逻辑单元), 计算机单元还有哪些? 系统单元:系统单元包括CPU.主存储器(内 ...
- 使用DTK创建模糊背景窗口并自定义阴影效果
DTK是deepin开发的基于Qt的开发套件,提供了大量的具有独特风格的美化控件,也提供了很多非常方便的API,下边我们用DTK实现一个模糊窗口,并设置其阴影效果. 使用场景 一切需要模糊窗口作为美化 ...
- Android 神奇的SpannableStringBuilder
一 无图言屌 先看看神奇的效果 仅用一个TextView实现 二 SpannableStringBuilder Google官方介绍 This is the class for text whose ...
- sentry can not delete release bug
sentry can not delete release bug bug $ ./node_modules/@sentry/cli/bin/sentry-cli releases list $ ./ ...
- git alias all in one
git alias all in one workspace:工作区 staging area:暂存区/缓存区 local repository:或本地仓库 remote repository:远程仓 ...
- js var & let & const All In One
js var & let & const All In One js var & let & const 区别对比 var let const 区别 是否存在 hois ...
- Microsoft Lifecycle Policy
Microsoft Lifecycle Policy The Microsoft Lifecycle Policy gives you consistent and predictable guide ...
- Mila Fletcher :其实高度自律的人生并没有那么难养成
在日常生活中,我们经常会发现,不论是学习,考证,工作,都需要坚持付出.但是很多人都没有办法在枯燥的学习过程中持续下去,这通常是因为不够自律导致的.但是尽管大家都知道自律是多么重要,却没有几个人可以真正 ...
- PHP反序列化字符串逃逸
通过CTF比赛了解PHP反序列化,记录自己的学习. 借用哈大佬们的名言 任何具有一定结构的数据,如果经过了某些处理而把结构体本身的结构给打乱了,则有可能会产生漏洞. 0CTF 2016piapiapi ...
- 进阶高阶IoT架构-教你如何简单实现一个消息队列
前言 消息队列是软件系统领域用来实现系统间通信最广泛的中间件.基于消息队列的方式是指由应用中的某个系统负责发送消息,由关心这条消息的相关系统负责接收消息,并在收到消息后进行各自系统内的业务处理.消息可 ...