JVM7知识图谱
2021-12-07 18:02:13 0 举报
JVM详解
作者其他创作
大纲/内容
操作数栈
Juli(服务器日志)
Engine
解释器Interpreter
当前栈帧
其他协议
o.wait(n)让锁
线程执行iadd指令
CPU寄存器
JIT编译器
栈帧1
(1)Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);(2)在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。(3)当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!(4)当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。
总线MESI缓存一致性(总线嗅探机制)
1
虚拟机栈
Filter Chain
方法出口
Servlet
共享变量
其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。(1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。(2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。(3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。
Slot[0]
LockSupport.parkUntil(n)
终止TERRIMETED
Thread1
线程共享
0
Service A
Perm Gen永久代(也就是方法区)
Threadn
虚拟机栈VM Stack
目标代码生成器
当前方法
Connector B
PC Register for Thread2
Browser
现代CPU架构模型
静态变量
JMM控制
JDK1.8
* 线程是用来执行方法的,怎么执行取决于虚拟机栈* 每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。* 局部变量表:存放了编译时期克制的8中基本数据类型、对象引用(reference类型)和returnAddress类型* 操作数栈:操作数栈是一个后入先出(Last In First Out)栈,方法的执行操作在操作数栈中完成,每一个字节码指令往操作数栈进行写入和提取的过程,就是入栈和出栈的过程。* 动态链接:* 方法出口:当一个方法被执行后,有两种方式退出该方法:执行引擎遇到了任意一个方法返回的字节码指令或遇到了异常,并且该异常没有在方法体内得到处理。
int y = 1;
store
堆Heap Area
运行时数据区Runtime Data Area
LockSupport.park()
加载Linking
Blocked阻塞
t.join()让锁
局部变量表
Waiting等待
JVM运行时数据区Runtime Data Area
write
Pipeline
线程A
......
JAVA内存模型
本地内存
0 int x=0
返回值出栈压入
探测器
Wrapper A
Old Gen
synchronized方法
HTTP协议
CPU
结果入栈
正常完成出口
线程B
工作内存共享变量副本
Thread2
线程独占
Tomcat服务器架构图
JVM中共享数据空间 (HotSpot 1.7)
returnAddress
Application Class Loader
Initialization
...
加载Loading
int x = 0;
本地方法库Native Method Libraries
初始化NEW
时间到
Host A
类信息
3
1 int y=1
o.wait()让锁
代码优化器
RequestResponse
Host B
Service B
Server服务器
Slot[n]
内存RAM
PC Register for Threadn
Thread.sleep(n)不让锁
栈帧1(方法)
Value A
PC Register for Thread1
From Survivor0
栈帧n(方法)
Bootstrap Class Loader
Eden Space伊蒲园
* Engine: 用来管理多个站点,一个Service只有一个Engine* Host: 虚拟主机,代表一个站点,通过配置Host就可以添加站点* Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件* Wrapper:每一个Wrapper封装着一个Servlet
test()栈帧
直接内存
Connector A
执行引擎Execution Engine
Verify
程序计数器Program Counter Register(可以理解为CPU寄存器)
系统调度
类文件Class Files
0 int x
Enginer Pipeline
新生成的对象首先放到年轻代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都会停止应用所有线程。
运行时常量池
动态链接
read
本地库接口Native InterfaceJNI
相关资料存放地址:https://github.com/zhonghuasheng/Tutorial
notify/notifyAll
本地方法栈Native Method Stack
Thread.yeild()不让锁
同步阻塞
JMX
异常完成出口
Host C
Context Value
栈帧n
垃圾回收器GC
Engine Value
LockSupport.parkNanos(n)
Host Value
多核CPU内存交互架构
获得锁
assign
知识点:Stop-the-World:JVM执行任何一种GC算法时是会停止应用程序的执行的,所以大多数GC优化都是从减少Stop-the-world发生的时间来提高程序性能。SafePoint:安全点。在JVM进行可达性分析的时候要在安全点进行,这个点是所有线程都被冻结,避免出现分析过程中对象的引用关系还在不断变化。前面说的程序停止不是随便停止,而是到达安全点之后再停顿下来。产生安全点的地方有:方法调用,循环跳转,异常跳转等年轻代区的垃圾收集器1、Serial收集器 单线程收集器,进行垃圾收集的时候必须暂停其他所有工作线程,直到收集结束。对于运行在client模式下的虚拟机是个很好的选择。可以通过设置-XX:+UseSerialGC进行使用,使用的是复制算法回收。2、ParNew收集器 使用多条线程进行垃圾收集,其余行为和Serial收集器一样,可以和CMS收集器配合工作。可以通过设置-XX:+UseParNewGC进行使用,一般使用在server模式下。使用的是复制算法回收。3、Parallel Scavenger收集器 前面两个收集器在于关注用户线程停顿时间,而这个收集器关注点在于达到一个可控的吞吐量【吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)】,适合在后台运算不需要太多交互的任务。可以通过设置-XX:+UseParallelGC进行使用,是在server模式下的默认收集器。使用的是复制算法回收。老年代区的垃圾收集器1、Serial Old收集器单线程收集器,进行垃圾收集的时候必须暂停其他所有工作线程,直到收集结束。client模式下的虚拟机默认的老年代收集器。可以通过设置-XX:+UseSerialOldGC进行使用,使用的是标记-整理算法回收。2、Parallel Old收集器 配合年轻代为Parallel Scavenger收集器使用的,行为都与Parallel Scavenger收集器差不多只是算法不一样。同样适合在后台运算不需要太多交互的任务。可以通过设置-XX:+UseParallelOldGC进行使用。使用的是标记-整理算法回收。3、CMS收集器 是一种以获取最短回收停顿时间为目标的收集器,可以通过设置-XX:+UseConcMarkSweepGC进行使用。基于标记-清除算法。运动过程有6个步骤: 初始标记:需要虚拟机进行stop-the-world,仅标记一下GC Roots所能连接到的对象 并发标记:进行GC Roots 追踪的过程,这时候程序不会停顿 并发预清理:查找执行并发标记阶段从年轻代进入老年代的对象。 重新标记:进行stop-the-world,扫描CMS堆中的剩余对象 并发清除:清理垃圾对象,程序不会停顿 并发重置:重置CMS收集器的数据结构 使用这个收集器使得用户进程能在运行的时候进行清理垃圾对象。在清理过程中产生的垃圾对象会由下一次再回收。但是由于使用的是标记-清除算法,容易使得内存碎片化。4、G1收集器 这是一个既用于年轻代也用于老年代的收集器。使用G1收集器时Java堆就会与使用其他收集器的布局不同。它是将整个Java堆内存划分为多个大小相等的Region,这样年轻代和老年代就不再物理隔离。 可以通过设置-XX:+UseG1GC进行使用,使用的是复制+标记-整理算法回收。这样就不会出现内存碎片化。 具备如下特点: 并行与并发,使用多个CPU来缩短stop-the-world的停顿时间,这样在GC的时候不需要停顿Java线程。使得GC和用户线程并发执行。 分代收集:G1是存在于年轻代和老年代的收集器。年轻代使用负责算法,老年代使用收集器。 空间整合。是基于标记-整理的算法实现的。可以解决内存碎片的问题。 可预测的停顿。能让使用者明确指定在一个长度为M毫秒的时间片段内。
synchronized代码块
Context A
Executor(并发相关)
Container
RUNNABLE
出栈
Context Pipeline
来回切换
即时编译器编译后的代码
load
To Survivor1
* JVM共享数据空间包括新生代、老年代、永久代。其中新生代、老年代属于Java堆。* 堆空间内存分配(默认情况下) 老年代 : 三分之二的堆空间 年轻代 : 三分之一的堆空间 eden区: 8/10 的年轻代空间 survivor0 : 1/10 的年轻代空间 survivor1 : 1/10 的年轻代空间
lock
时间到,主线程继续运行
Processor协议处理接口
调用者栈帧
CPU缓存
Context C
Wrapper Value
Jasper(JSP引擎)
子线程运行完,主线程才能继续
GC垃圾回收
类加载子系统ClassLoader Sub System
Host Pipeline
t.join(n)让锁
Naming(命名服务)
程序计数器Program Counter Register
-Xms最小堆空间 -Xmx最大堆空间
Wrapper B
Value B
Container处理请求使用的是Pipeline-Valve管道来处理Pipeline: 管道 Valve:阀门Pipeline-Value使用的是责任链模式,在一个request请求的过程中有很多处理者对请求进行处理,每个处理者负责做自己相应的处理,处理完后将处理的请求返回,再让下一个处理者继续处理。Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;(2)在上层容器的管道的BaseValve中会调用下层容器的管道。Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。
中间代码生成器
JDK1.7
方法区Method Area
元空间
新生代Young GenMontor GC-Xmn设置新生代大小
Protocol Handler
READY就绪
Prepare
Connector C
其他程序
RUNNING运行
对象
主内存
Timed Waiting(限时)等待
Error Report Value
1 int y
HTTPS协议
Context B
老年代Old GenMajor GC
Endpoint通信监听的接口
Adapter
unlock
Extension Class Loader
Resolve
超时被唤醒notify/notifyAll
Wrapper C
用来存放那些被native关键字标记的方法,在Execution Engine执行时加载本地方法库
Object obj = new Object()
use
0 条评论
下一页