看 JVM 视频有感
该专栏是 看张龙深入理解JVM视频总结(本专栏仅对作者自己学习总结,对视频作者关于传播知识保持尊敬)
SSamsa
我要出道了
展开
-
观看JVM文章前须知:有关JVM的所有文章说明
1.数据库采用单表设计,通过代码来维护表关系,且通过主从复制实现高可用,通过读写分离充分利用服务器性能和数据库性能主从复制的原理:①当主数据库发生了数据”更新”时,会将更新的消息写入二进制日志文件中.②从库会通过IO线程实时的读取主库更新的内容.③将读取到的信息写入中继日志中.④Sql线程会实时的读取中继日志中的信息,实现数据入库处理,从而实现主从数据同步....原创 2020-03-10 21:29:29 · 85 阅读 · 0 评论 -
91+92+93-G1垃圾收集器官方文档透彻解读+原理剖析+系统化说明
G1垃圾收集器官方文档透彻解读G1官网地址:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html?source=:ow⭕️p:nav:0916BCButtonGetting Started with the G1 Garbage Collector1. Overview1.1 Purpose This tutorial covers the basics of原创 2020-05-27 23:00:19 · 6052 阅读 · 0 评论 -
90-G1垃圾收集器角色划分与重要概念详解
G1垃圾收集器角色划分与重要概念详解G1重要概念分区(Region):G1采用了不同的策略来解决并行、串行和CMS收集器的碎片、暂停时间不可控等问题——G1将整个堆分成大小相同的分区(Region);每一个分区都可能是年轻代,也可能是老年代,但是在同一时刻只能属于某一个代。年轻代、幸存区、老年代这些概念还存在,成为逻辑上的概念,这样方面复用之前分代框架的逻辑;在物理上不需要连续,则带来了额外的好处——有的分区内垃圾对象特别多,有的分区内垃圾对象很少,G1会优先回收垃圾对象特别多的分区原创 2020-05-27 20:01:26 · 151 阅读 · 0 评论 -
89-G1垃圾收集器内存划分与角色分派
G1垃圾收集器内存划分与角色分派G1的设计规划是要替换掉CMSG1在某些方面弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,自然会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要管理内存碎片。另外,G1提供了更多手段,已达到对GC停顿时间的可控。Hotspot虚拟机主要构成[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HkFQg3Xn-1590580803727)(assets/1580626178999.pn原创 2020-05-27 20:00:27 · 177 阅读 · 0 评论 -
88-G1垃圾收集器设计目标与改良手段
G1垃圾收集器设计目标与改良手段G1 (Garbage First Collector)吞吐量吞吐量关注的是,在一个指定的时间内(其实就是单位时间内),最大化一个应用的工作量。如下方式衡量一个系统吞吐量的好坏:在一个小时内同一个事务(或者任务、请求)完成的次数(tps)数据库一小时可以完成多少次查询对于关注吞吐量的系统,卡顿是可以接受的,因为这个系统关注长时间的大量任务的执行能力,单次快速的响应并不值得考虑。响应能力响应能力指一个程序后者系统对请求是否能够及时响应,比如原创 2020-05-27 19:59:03 · 322 阅读 · 0 评论 -
86-JVM垃圾回收+CMS收集器重点内容阶段性复习与总结
JVM垃圾回收+CMS收集器重点内容阶段性复习与总结74~85节回顾原创 2020-05-27 19:58:05 · 94 阅读 · 0 评论 -
85-实例透彻分析CMS垃圾收集器执行过程
实例透彻分析CMS垃圾收集器执行过程CMS收集器收集步骤:Phase 1:Initial Mark 初始标记Phase 2:Concurrent Mark 并发标记Phase 3:Concurrent Preclean 并发预清除Phase 4:Concurrent Abortable Preclean 并发中止预清除Phase 5:Final Remark 最终的重新标记Phase 6:Concurrent Sweep 并发清除Phase 7:Concurrent Reset 并发重置原创 2020-05-27 08:37:10 · 154 阅读 · 0 评论 -
84-CMS垃圾收集器深入讲解
CMS垃圾收集器深入讲解CMS收集器:Concurrent Mark Sweep(并发标记清除,并发:是指垃圾回收线程和用户业务线程可以同时执行[也并不是绝对的])CMS收集器,以获取最短回收停顿时间为目标,多数应用于互联网站或者B/S系统的服务器端上。CMS是基于“标记——清除”算法实现的,整个过程分为4个步骤:初始标记(CMS initial mark);并发标记(CMS concurrent mark);重新标记(CMS remark);并发清除(CMS原创 2020-05-27 08:29:10 · 183 阅读 · 0 评论 -
83-安全点与安全区详解
安全点与安全区详解枚举根节点当系统停顿下来后,并不需要一个不漏地检查所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得知那些地方存放着对象引用。在HotSpot的实现中,是使用一组成为OopMap的数据结构来达到这个目的的。安全点在OopMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举,但一个很现实的问题随之而来:可能导致引用关系变化,或者说OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那将会需要大量的额外空间,这样GC的空间成本将原创 2020-05-27 08:27:28 · 507 阅读 · 0 评论 -
82-实例演示MaxTenuringThreshold参数及阈值动态调整策略-
实例演示MaxTenuringThreshold参数及阈值动态调整策略对Survivor空间来说:当某一个Survivor空间中对象所占据的空间容量超过了60%,将会重新计算对象晋升的阈值,而不会使用MaxTenuringThreshold所显示配置的阈值。如:survivor空间为10M是,那么当对象占用6M时,就会重新计算对象晋升的阈值。-XX:TargetSurvivorRatio=60-XX:PrintGCDateStamps 打印当前GC的时间戳-XX:+UseConcMarkSw原创 2020-05-27 08:24:40 · 272 阅读 · 0 评论 -
81-MaxTenuringThreshold与阈值的动态调整详解
MaxTenuringThreshold与阈值的动态调整详解//打印JVM参数-XX:+PrintCommandLineFlags//(1)作用:在可以自动调节对象晋升(Promote)到老年代阈值的GC中,设置该阈值的最大值;//(2)该参数的默认值为15,CMS中默认值为6,G1中默认为15,(JVM中,该数值是由4个bit来表示的,所以最大值1111,即15)//(3)经历了多次GC后,存活的对象会在From Survior与To Survivor之间来回存放,而这里的一个前提则是这两个空原创 2020-05-27 08:23:04 · 365 阅读 · 0 评论 -
80-阈值和垃圾收集器类型对于对象分配的影响实战分析
阈值和垃圾收集器类型对于对象分配的影响实战分析//打印JVM的一些默认参数C:\***\***>java -XX:+PrintCommandLineFlags -version-XX:InitialHeapSize=199142400 //初始的堆大小-XX:MaxHeapSize=3186278400 //堆最大容量-XX:+PrintCommandLineFlags //打印命令行的相关启动信息-XX:+UseC原创 2020-05-24 22:31:57 · 137 阅读 · 0 评论 -
79-新生代与老年代垃圾收集器实现详解
新生代与老年代垃圾收集器实现详解默认情况下: 虚拟机中新生代和老年代所采用的垃圾收集器为:【在jdk1.8中,并不能保证其他的】 PSyoungGen:Parallel Scavenge(新生代垃圾收集器); ParOldGen:Parallel Old(老年代垃圾收集器)★★★ 当新生代无法容纳下将要创建的对象的话,那么这个对象将在老年代产生分配。实例:public class MyTest1 { public static void main(S原创 2020-05-24 22:27:06 · 426 阅读 · 1 评论 -
78-垃圾回收日志与算法深度解读
垃圾回收日志与算法深度解读实例:-verbose:gc //会输出GC的详细信息-Xms20M //堆栈的最小容量为20M-Xmx20M //堆栈的最大容量为20M-Xmn10M //新生代为10M-XX:+PrintGCDetails //打印垃圾回收的详细信息-XX:SurvivorRatio=8 //表示eden和Survivor空间的占比为8:1 public class MyTest1 { public static void main(Strin原创 2020-05-24 22:26:04 · 94 阅读 · 0 评论 -
77-Java内存泄漏经典原因分析
Java内存泄漏经典原因分析Java内存泄漏经典原因分析:对象定义在错误的范围(Wrong scope);异常(Exception)处理不当;集合数据管理不当。对象定义在错误的范围(Wrong scope)如果Foo实例对象的生命较长,会导致临时性内存泄漏。(这里names变量其实只有临时作用)class Foo{ private String[] names; public void odIt(int length){ if(names == n原创 2020-05-24 22:24:54 · 179 阅读 · 0 评论 -
76-JVM垃圾回收器理论分析与讲解
JVM垃圾回收器理论分析与讲解年轻代(Young Generation)新生成的对象都放在新生代。年轻代用复制算法进行GC(理论上,年轻代对象的生命周期非常短,所以适合复制算法);年轻代分为三个区。一个eden区,两个survivor(可以通过参数设置survivor)。对象在eden区中生成。当eden区满时,还存活的对象将被复制到一个survivor区,当这个survivor区满时,此区的存活对象将被复制到另外一个survivor区,当第二个survivor区也满了的时候,从第一个survi原创 2020-05-24 22:23:44 · 85 阅读 · 0 评论 -
75-JVM垃圾回收算法分析与演示
JVM垃圾回收算法分析与演示标记-清除算法(Mark-Sweep)标记-整理算法(Mark-Compact)复制算法(Copying)分代算法(Generational)★★★GC算法是内存回收的方法论,垃圾收集器就是算法的落地实现标记-清除算法(Mark-Sweep)算法分为是”标记“和”清除“两个阶段,首先标记出所有需要回收的对象,然后回收所有需要回收的对象。缺点:效率问题:标记和清理两个过程效率都不高;(需要扫描所有对象。堆越大,GC越慢)空间问题:标记清理之后会产原创 2020-05-24 22:15:28 · 148 阅读 · 0 评论 -
74-JVM垃圾回收重要理论剖析
JVM垃圾回收重要理论剖析JVM运行时内存数据区域程序计数器本地方法栈Java虚拟机栈(JVM Stack)Java虚拟机栈描述的是Java方法的执行模型:每个方法执行的时候都会创建一个帧(Frame),栈用于存放局部变量表、操作栈、动态链接、方法出口等信息。一个方法的执行过程就是对于帧栈的入栈和出栈过程。线程隔离堆(Heap)堆里存放的是对象的实例是Java虚拟机管理内存中最大的一块GC主要的工作区域,为了高效GC,会把堆细分为更多的子区域线程共享原创 2020-05-24 22:10:07 · 73 阅读 · 0 评论 -
70~73-JVM课程阶段性总结与系统回顾
JVM课程阶段性总结与系统回顾回顾,回顾,回顾原创 2020-05-24 22:07:41 · 76 阅读 · 0 评论 -
69-jmc与jhat工具使用详解
jmc与jhat工具使用详解原创 2020-05-24 22:06:41 · 140 阅读 · 0 评论 -
68-jcmd命令实战讲解
jcmd命令实战讲解jps命令//用于显示java中当前正在运行的线程C:\Users\admin>jps -helpusage: jps [-help] jps [-q] [-mlvV] [<hostid>]Definitions: <hostid>: <hostname>[:<port>]C:\Users\admin>jps5600 Launcher9808 Launcher7812 Jps原创 2020-05-24 22:05:11 · 489 阅读 · 0 评论 -
67-jmap与stat工具实战分析
jmap与stat工具实战分析实例:public class MyTest5 { public static void main(String[] args) { for (; ;) { System.out.println("hello world"); } }}linux 下查看java所有的进程端口号信息:ps -ef | grep javawindow下不知道咋查看:然后再:jmap -clstat原创 2020-05-24 21:58:10 · 241 阅读 · 0 评论 -
66-JVM元空间深度解析
JVM元空间深度解析实例:/** * -XX:MaxMetaspaceSize=10m -XX:TraceClassLoading */public class MyTest4 { public static void main(String[] args) { for (; ; ) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyTest4.cla原创 2020-05-24 21:54:48 · 85 阅读 · 0 评论 -
65-线程死锁检测与 分析工具深度解析
线程死锁检测与 分析工具深度解析jconsole的使用:产生死锁的实例:public class MyTest3 { public static void main(String[] args) { //当A线程执行方法A.method的时候,会去执行B.method(); //这个时候,A尝试去获取B的锁,但是B的锁已经被B线程获取,此时A线程就会等待B线程释放B锁 //B线程与之相反,最终造成死锁。 new Thread(()原创 2020-05-24 21:53:09 · 157 阅读 · 0 评论 -
64-线程栈溢出监控与分析详解
线程栈溢出监控与分析详解虚拟机栈溢出:实例:public class MyTest2 { private int length; public int getLength() { return length; } public void test(){ this.length++; try { Thread.sleep(300); //这里,为了让当前进程保持的时间长一点,方便利用jvisua原创 2020-05-24 21:50:06 · 161 阅读 · 0 评论 -
63-实战jvisualvm
实战jvisualvm查看堆的情况:实例:public class MyTest1 { public static void main(String[] args) { List<MyTest1> list = new ArrayList<>(); for (; ;) { list.add(new MyTest1()); System.gc(); //显式垃圾回收! }原创 2020-05-24 21:47:26 · 102 阅读 · 0 评论 -
62-Java对象内存分配原理与布局
Java对象内存分配原理与布局 注:在Hotspot虚拟机中,虚拟机栈和本地方法栈是合二为一的。区域是否线程共享是否会内存溢出程序计数器否不会虚拟机栈否会本地方法栈否会堆是会方法区是会关于Java对象创建的过程:new关键字创建独享的3个步骤:1.在堆内存中创建出对象的实例;2.为对象的实例成员变量赋初...原创 2020-03-14 14:43:28 · 112 阅读 · 0 评论 -
60+61-JVM内存空间划分与作用详解-JVM堆空间用途分析与划分依据
JVM内存空间划分与作用详解+JVM堆空间用途分析与划分依据虚拟机栈:Stack Frame 栈帧 。每一个线程所独有的,不能共享。程序计数器(Program Counter):用来表示下一次将要执行哪一行。每一个线程所独有的,不能共享。本地方法栈:主要用于处理本地方法。native方法。 Hotspot将虚拟机栈和本地方法栈合二为一了。堆(Heap):JVM管理的最大一块内存空间。堆上...原创 2020-03-14 14:40:05 · 139 阅读 · 0 评论 -
59-JVM字节码整体回顾与总结
JVM字节码整体回顾与总结回顾37~58节内容!!!原创 2020-03-14 14:39:12 · 60 阅读 · 0 评论 -
58-动态代理实现机制深层次分析与动态字节码生成总结
动态代理实现机制深层次分析与动态字节码生成总结先寻找代理类是如何生成的: 这里生成动态代理的字节流。如何在动态代理期间写入磁盘:原创 2020-03-14 14:35:15 · 94 阅读 · 0 评论 -
57-透过字节码生成审视Java动态代理运作机制
透过字节码生成审视Java动态代理运作机制public interface Subject { void request();}public class RealSubject implements Subject { @Override public void request() { System.out.println("From real su...原创 2020-03-14 14:32:54 · 84 阅读 · 0 评论 -
55-基于栈的指令集与基于寄存器的指令集详细比对
基于栈的指令集与基于寄存器的指令集详细比对 现代JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。 解释执行:就是通过解释器来读取字节码,遇到相应的指令就去执行该指令。 编译执行:就是通过即时编译器(Just In Time ,JIT)将字节码转换为本地机器码来执行,现代JVM会根据代码热点来生成响应的本地机器码。基于栈的指令集与基于寄存器的...原创 2020-03-14 14:29:16 · 277 阅读 · 0 评论 -
54-虚方法表与动态分派机制详解
虚方法表与动态分派机制详解 针对于方法调用动态分派的过程,虚拟机会在类的方法区建立一个虚方法表的数据结构(virtual method table,vtable); 针对于invokeinterface指令来说,虚拟机会建立一个叫做接口方法表的数据结构(interface method table,itable);public class MyTest7 { publi...原创 2020-03-14 14:27:38 · 167 阅读 · 0 评论 -
53-通过字节码分析Java方法的静态分派与动态分派机制
通过字节码分析Java方法的静态分派与动态分派机制方法的动态分派:方法的动态分派涉及到一个重要的概念:方法接受者。多态,运行期的行为,涉及到invokevirtual字节码指令的多态查找流程:首先,到操作数的栈顶,去寻找到栈顶的元素所指向的这个对象的实际类型;第二步:如果在上面的过程当中寻找到了与常量池当中的“这个描述符“[下面这段] invokevirtual #6 ...原创 2020-03-14 14:24:42 · 181 阅读 · 0 评论 -
52-方法重载与invokevirtual字节码指令的关系
方法重载与invokevirtual字节码指令的关系五个指令:① invokeinterface:调用接口中的方法,实际上是在运行期决定的,决定到底调用实现该接口的哪个对象的特定方法。② invokestatic:调用静态方法。③ invokespecial:调用自己的私有方法、构造方法()以及父类方法。④ invokevirtual:调用虚方法,运行期动态查找的过程。⑤ invo...原创 2020-03-14 14:22:11 · 115 阅读 · 0 评论 -
51-栈帧与操作数栈剖析及符号引用与直接引用的转换
栈帧与操作数栈剖析及符号引用与直接引用的转换栈帧栈帧是一种用于帮助虚拟机执行方法调用与方法执行的数据结构。栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法的返回地址以及操作数栈等信息。注:栈帧其实是归属于一个一个的线程的,一个线程只会拥有独有的一份栈帧结构,因此栈帧不存在所谓的并发调用的情况。public class MyTest4 { private v...原创 2020-03-14 14:20:51 · 170 阅读 · 0 评论 -
50-通过字节码分析Java异常处理机制
通过字节码分析Java异常处理机制通过字节码分析Java异常处理机制Java字节码对于异常的处理方式:① 统一采用异常表的方式来对异常进行处理。② 在jdk 1.4.2之前的版本中,并不是使用异常表的方式来对异常进行处理的,而是采用特定的指令方式。③ 当异常处理存在finally语句块时,现代化的JVM采用的处理方式是将finally语句块的字节码拼接到每一个catch块后面...原创 2020-03-14 13:47:13 · 175 阅读 · 0 评论 -
49-通过字节码分析this关键字以及异常表的重要作用
通过字节码分析this关键字以及异常表的重要作用public class MyTest3 { public void test(){ try { InputStream is = new FileInputStream("test.txt"); ServerSocket serverSocket = new ServerS...原创 2020-03-14 13:45:25 · 122 阅读 · 0 评论 -
48-构造方法与静态代码块字节码指令详解
构造方法与静态代码块字节码指令详解构造方法:从图中可以看出,非静态变量的赋值,是在构造方法中完成的!!!★★关于对非静态变量的赋值★★①对于非静态变量的赋值,是在构造方法中完成的;该定义与变量的位置、构造方法的位置无关;同时,在 MyTest2(int i)方法中,sout 在赋值之后执行!②非静态变量的赋值可以在任意一个构造方法中完成,换句话说,在每个构造方法中,都会对非...原创 2020-03-14 13:42:31 · 171 阅读 · 0 评论 -
46-synchronized关键字所生成的字节码详细分析
synchronized关键字所生成的字节码详细分析1.synchronized 的 可重入锁和不可重入锁!!!!MyTest2package jvm.bytecode;public class MyTest2 { String str = "Welcome"; private int x = 5; public static Integer in = 1...原创 2020-03-14 13:39:09 · 136 阅读 · 0 评论