JVM
文章平均质量分 56
前路无畏
大厂AI算法工程师,聚焦AI领域最新技术的分享和落地。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
下载hotspot源码
这里穿插,怎么下载jvm的源码,当然下载的是openjdk的jvm源码:1. http://hg.openjdk.java.net/选择格式下载即可:各路径的意义:├─agent Serviceability Agent的客户端实现├─make 用来build出HotSpot的各种配置文件├─src HotSpot VM的源代原创 2021-06-27 10:28:51 · 1399 阅读 · 1 评论 -
032-JVM-指令重排验证
上一篇:031-JVM-合并写(write combining)https://yuhongliang.blog.youkuaiyun.com/article/details/112135299由于cpu的执行特别快,在需要和内存或者缓存进行交互的时候就有了大把的时间,这个时间就需要执行其他的指令,这个时候就有可能会出现乱排的情况。下面的例子如果出现了0,0的情况,就说明出现了乱爬,按我们正常的逻辑是不会出现乱排的,但是在这种情况下就会出现:在x,y均赋值默认值的时候,就会出现这种情况。1. 代码如下:pac原创 2021-01-03 15:43:00 · 9835 阅读 · 1 评论 -
031-JVM-合并写(write combining)
当cpu修改了某值后会把数据线存入L1中,这个时候可能没有命中,则会一往下查找,会写入到L2中,此时,由于往L2中写的时候需要大量的时间,同时这个变量还可能继续被修改,此时会用到合并写的技术,所谓合并写就是把两次的写的结果一次进行写出。这里会用到合并鞋的地址空间,一共4个字节,也就是如果我们的修改在4个字节以内,则会使用到合并写的技术,如果超过4个字节,则无法使用到合写的红利。下面给出一个例子,1. 一次写6个字节package com.yuhl.c2020;/** * @author yuh原创 2021-01-03 15:24:29 · 9688 阅读 · 0 评论 -
029-JVM-volatile和指令重排
上一篇:028-JVM-类加载子系统面试题实战https://yuhongliang.blog.youkuaiyun.com/article/details/111799834volatile可以防止,指令重拍,这个大多数小伙伴是知道的,但是他防止的是哪些指令的重拍呢?如果我们放任指令重拍会产生什么严重后果呢?这个未必都知道,下面就把这个问题说清楚。1. 从new一个对象说起1.1 源码package com.yuhl.c2020;/** * @author yuhl * @Date 2020/12/3原创 2020-12-30 20:52:26 · 12224 阅读 · 2 评论 -
028-JVM-类加载子系统面试题实战
上一篇:027-JVM-打破双亲委派机制https://yuhongliang.blog.youkuaiyun.com/article/details/111755901从实践到理论总结的过程 。1. 分析代码的执行过程package com.yuhl.c2020;/** * @author yuhl * @Date 2020/12/27 13:55 * @Classname Test2 * @Description TODO */public class Test2 { public s原创 2020-12-27 14:43:51 · 11199 阅读 · 0 评论 -
027-JVM-打破双亲委派机制
上一篇:026-JVM-jvm对类的延时加载https://yuhongliang.blog.youkuaiyun.com/article/details/111600183为了类的安全加载,jvm底层默认实现为双亲委派,但是在实际开发中有没有 - 打破这种双亲委派机制的情况呢?答案是肯定的:有1. 打破双亲委派的原理原理是什么?前面从源码我们看到,在ClassLoader的loadClass()方法实现类具体的双亲委派逻辑,如果要打破就要用我们自己写的ClassLoader,用我们自己的loadClas原创 2020-12-26 17:28:04 · 14167 阅读 · 0 评论 -
026-JVM-jvm对类的延时加载
上一篇:025-JVM-虚拟机执行代码的模式解释执行+及时编译JIT https://yuhongliang.blog.youkuaiyun.com/article/details/111598534jvm加载类均是采用延时加载的方式LazyLoading。当不使用一个类的时候肯定是不会去加载的。在jvm规范中,规定了必须加载类的5中情形,这里给出,可以结合自己的开发和学习情况很容易想到。无须背过!1.必须加载类的5中情形new getstatic putstatic invokestatic 指令,访问fi原创 2020-12-23 22:09:14 · 11539 阅读 · 0 评论 -
025-JVM-虚拟机执行代码的模式:解释执行+及时编译JIT
上一篇:024-JVM-自定义类加载器https://yuhongliang.blog.youkuaiyun.com/article/details/111567879hotspot什么意思,就是热点探测的意思,就是jit,探测到时热点就编译为native code ,后面再执行就快了。1. 什么是热点代码就是执行测试多的代码,可以使用参数进行设置:-XX:CompileThreshold = 10000 默认值1万次数超过这个值就触发及时编译!2.默认使用的是什么执行方式?混合模式:3.个模式原创 2020-12-23 21:54:44 · 11304 阅读 · 0 评论 -
024-JVM-自定义类加载器
上一篇:023-JVM-类加载器源码分析https://yuhongliang.blog.youkuaiyun.com/article/details/111566920分析完源码,下面自定义类加载器。1. 把编译后的Miao.class放在D:\tmp\jvm目录下2. 代码实现,及分析package com.yuhl.c2020;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStre原创 2020-12-22 22:06:56 · 11245 阅读 · 0 评论 -
023-JVM-类加载器源码分析
上一篇:022-JVM-各类加载器加载哪些类?(类加载器的势力范围)https://yuhongliang.blog.youkuaiyun.com/article/details/111566140类加载的过程分析:1. loadClass() 加载任何类package com.yuhl.c2020;/** * @author yuhl * @Date 2020/12/22 21:27 * @Classname LoadClassResource * @Description TODO */pub原创 2020-12-22 21:45:48 · 11264 阅读 · 0 评论 -
022-JVM-各类加载器加载哪些类?(类加载器的势力范围)
上篇说到各类加载器再第二次得到加载一个类的时候,会在自己的视力范围内查找这个类是否存在,如果存在就加载,如果不存在就给自己孩子传出去。第一次拿到的时候需要给自己的爸爸,当然了bootstrapClassLoader没有爸爸,就是第一次拿到的时候了。那么这三个类加载器的实例范围,或者首查找的范围是什么?1. BootStrapClassLoader的实例范围在sun.boot.class.path中2. ExtClassLoader的实例范围在java.ext.dirs中3. AppClas.原创 2020-12-22 20:39:16 · 11369 阅读 · 0 评论 -
021-JVM-双亲委派机制
上一篇:020-JVM-类加载器的四个层级-ClassLoader https://yuhongliang.blog.youkuaiyun.com/article/details/111500612前面我们知道类的加载均是由ClassLoader加载进入内存的,那么这里类的加载有没有三六九等呢?加入我自己定义一个java.lang.String类,偷偷摸摸的写一些代码,去坑别人迷惑别人可以吗?答案是不可以的,这种安全问题不会出现,原因就是jvm加载类的时候有双亲委派机制。1. 什么是双亲委派机制Java虚原创 2020-12-22 20:17:53 · 12826 阅读 · 1 评论 -
020-JVM-类加载器的四个层级-ClassLoader
上一篇:019-JVM-类的加载过程 https://yuhongliang.blog.youkuaiyun.com/article/details/1114996041.package sun.misc.Launcher 是java虚拟机的入口应用吸纳来看下ClassLoader的代码层面的集成关系:这里要说明三点:在java程序中ClassLoader是类加载器的最顶级的类ExtClassLoader和ApppClassLoader均为ClassLoader类的的派生类Bootstrap Class原创 2020-12-21 22:12:49 · 12254 阅读 · 0 评论 -
019-JVM-类的加载过程
前一篇:018-JVM-class文件的形象表示https://yuhongliang.blog.youkuaiyun.com/article/details/1114991461.类加载子系统类加载子系统负责从文件系统或者网络中加载class文件到运行时数据区。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放在一块成为方法区的内存空间中。2.类加载器ClassLoader角色Class file 存在于本地硬盘上,是原创 2020-12-21 21:13:24 · 11195 阅读 · 1 评论 -
018-JVM-class文件的形象表示
上一篇:017-JVM-JVM指令在多线程中是原子操作吗?https://yuhongliang.blog.youkuaiyun.com/article/details/111463444前面受过class文件中有那些元素,不够形象,这里画图更想想的表述出calss文件中中的信息:可以看原链接:https://www.processon.com/view/link/5fe0936a7d9c080207fa6f1c...原创 2020-12-21 20:40:30 · 11650 阅读 · 0 评论 -
017-JVM-JVM指令在多线程中是原子操作吗?
以下几个指令是原子操作:指令解释read读取write写入lock锁定unlock解锁load载入store存储use使用assign赋值原创 2020-12-20 21:47:44 · 14714 阅读 · 0 评论 -
016-JVM-十六进制class文件简单解读
1. 源码T0100_ByteCode01.javapackage com.yuhl;public class T0100_ByteCode01 {}2.class文件注意:默认编译后会有个无惨的构造方法//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.yuhl;public class T0100_B原创 2020-12-20 21:40:01 · 14541 阅读 · 0 评论 -
015-JVM-使用javap查看class文件内容
上一篇:014-JVM-查看class文按键的工具Binary viewer、ue、classlib Bytecode viewer https://blog.youkuaiyun.com/fsjwin/article/details/111423443处理使用上面的工具还可以使用javap查看class文件的格式1. 使用javap -v 查看Helloworld.class文件Microsoft Windows [版本 10.0.19041.685](c) 2020 Microsoft Corporatio原创 2020-12-20 15:08:09 · 14722 阅读 · 0 评论 -
014-JVM-查看class文件的工具Binary viewer、ue、classlib Bytecode viewer
查看编译出来的二进制文件的工具,一般可以看2进制和16进制,使用工具如下:1. Binary viewer自行搜索下载,打开后把class文件拉进去即可图标如下:启动如下:Helloword.class内容如下//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.yuhl;public class Hello原创 2020-12-20 14:56:55 · 15622 阅读 · 0 评论 -
014-JVM-Class文件结构概况
我们写了一个HelloWorld.java,然后通过javac编译出一个HelloWorld.class文件,那么这些类似的class文件中都存有那些东西呢?下面给出答案:1. Class文件结构概况下图有点模糊,可以直接访问查看源脑图:https://www.processon.com/view/link/5fdef0e763768907e4a967f72. 总结这个脑图是对class中含有文件的整体概况,一定要先过一遍,要有感性认识,然后在看二进制或者16进制的class文件源文件的时候绘原创 2020-12-20 14:38:51 · 13581 阅读 · 0 评论 -
013-JVM-JVM、JRE、JDK关系
上一篇:012-JVM-jvm规范出处、规范和实现https://blog.youkuaiyun.com/fsjwin/article/details/111406566JVM、JRE、JDK关系是个基础问题,但是或许你也未必那么明白。这次就把他搞的明明白白的。1. 线上官方图其实图片已经十分明白的说明了这个问题。关键是,你要一个字一个字的读一遍,别看下就曹操了事。2. JVM在最底层其实处于这个位置:3. JRE:Java runtime environment Java 运行环境运行时环境,原创 2020-12-19 16:58:05 · 14169 阅读 · 2 评论 -
012-JVM-jvm规范出处、规范和实现
上一篇:011-JVM-跨平台的语言和跨语言的平台https://blog.youkuaiyun.com/fsjwin/article/details/111405186对于java程序员来说jvm十分重要。那么你有么有想过一个问题?jvm的知识都是从哪里来的?现在市面上的一些有关书籍及知识是从哪里来的?1. JVM 有一套规范在oracle官网有对jvm的规范的文章,找到文档你可读一下,然后再去看市面山的jvm知识你会发现全部出自此,所以这里才是jvm的根的出处,好的,接下来我们找一下官方文档。1.1页面搜索原创 2020-12-19 16:44:26 · 15147 阅读 · 1 评论 -
011-JVM-跨平台的语言和跨语言的平台
我们经常听到这句话:跨平台的语言和跨语言的平台。他到底是什么意思?1. java是跨平台的语言意思是说我们程序员写代码的时候只写一份,javac编译也只编译一次,但是可以在windows上运行,也可以把打好的包放到unitx、linux、macos上运行。如果你是程序员,你一定不会感到奇怪,但是你有没有问一个问题?为什么可以呢? 记住一句话【生活哪有什么岁月静好,只是有人在为你负重前行】。你知道这个为我们负重前行的人是谁吗?就是jvm(java虚拟机Java Virtual Machine Jav原创 2020-12-19 15:32:05 · 13925 阅读 · 4 评论 -
010-JVM-Java从编译到执行的流程
1. 写一个java程序package com.yuhl;/** * @author yuhl * @Date 2020/12/19 15:01 * @Classname Helloword * @Description TODO */public class Helloword { public static void main(String[] args) { System.out.println("Helloword!"); }}2. 变异成一个原创 2020-12-19 15:07:19 · 14877 阅读 · 2 评论 -
009-JVM-对象的finalization机制
上一篇:008-JVM-清除阶段算法之三:标记-压缩算法Mark-Compacthttps://blog.youkuaiyun.com/fsjwin/article/details/111342195标记为不可达的对象一定会被回收吗?这是一个好问题,一般这么问的答案肯定是否定的!!!Object.java 中的方法: protected void finalize() throws Throwable { }1. finalization机制存在的必要性finalization机制简单说就是免死金牌,或原创 2020-12-17 23:07:30 · 14437 阅读 · 0 评论 -
008-JVM-清除阶段算法之三:标记-压缩算法Mark-Compact
上一篇:007-JVM-清除阶段算法之二:复制算法Copyinghttps://blog.youkuaiyun.com/fsjwin/article/details/111341315前面两种标记收集算法和复制算法各有劣势,所以就有了此算法:标记-压缩算法Mark-Compact1. 背景复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生, 但是在老年代, 更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活对象较多, 复制的成本也将很高。因此, 基于老年代垃圾原创 2020-12-17 22:09:26 · 14674 阅读 · 0 评论 -
007-JVM-清除阶段算法之二:复制算法Copying
上一篇:006-JVM-清除阶段算法之一:标记-清除算法 Mark-Sweep https://blog.youkuaiyun.com/fsjwin/article/details/1113396041. 背景为了解决标记 - 清除算法在垃圾收集效率方而的缺陷M.L.Minsky于1963 年发表了著名的论文, “ 使用双存储区的Lisp语言垃圾收集器CA LISP Garbage CoIIector Algorithm Using SeriaI Secondary Storage 。M.L.Minsky 在该论文原创 2020-12-17 22:00:10 · 14019 阅读 · 0 评论 -
006-JVM-清除阶段算法之一:标记-清除算法 Mark-Sweep
上一篇:005-JVM-清除阶段:单纯的讨论垃圾回收算法 https://blog.youkuaiyun.com/fsjwin/article/details/111326292先给出他的特点:位置不连续 产生碎片1.产生背景是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960 提出并应用于Lisp 语言。2.执行过程当堆中的有效内存空间(available memory) 被耗尽的时候, 就会停止整个程序( 也被称为stop the world:STW) , 然后进行两项工作:原创 2020-12-17 21:49:21 · 13577 阅读 · 0 评论 -
005-JVM-清除阶段:单纯的讨论垃圾回收算法
上一篇: 004-JVM-Java中使用的标记阶段的算法:可达性分析算法中GC Roots有哪些 https://blog.youkuaiyun.com/fsjwin/article/details/111322956前面我们知道了垃圾,并且有办法找到垃圾,找到之后怎么办呢?干掉kill掉吧。那么这里就单纯讨论一下有那些垃圾回收算法。标记阶段完成后,就是清楚阶段。吓人1. 标记清除 - 位置不连续 产生碎片2. 拷贝算法 - 没有碎片,浪费空间3. 标记压缩 - 没有碎片,效率偏低...原创 2020-12-17 20:04:27 · 14436 阅读 · 0 评论 -
004-JVM-Java中使用的标记阶段的算法:可达性分析算法中GC Roots有哪些
上一篇:003-JVM-标记阶段的算法:怎么确定垃圾 https://blog.youkuaiyun.com/fsjwin/article/details/111322134gc roots有哪些呢?这个是面试题,也要背下来,如果不想进大厂的话,可以不背。1. 常规gc rootsJVM stack虚拟机栈中引用的对象比如: 各个线程被调用的方法中使用到的参数、局部变量等nativ method stackJNI( 通常说的本地方法) 引用的对象runtime constant原创 2020-12-17 19:55:00 · 15074 阅读 · 0 评论 -
003-JVM-标记阶段的算法:怎么确定垃圾
我们知道,垃圾是需要被回收的,但是怎么知道哪些是垃圾呢?垃圾标记阶段:在堆里存放着几乎所有的Java 对象实例, 在GC 执行垃圾回收之前, 首先需要区分出内存中哪些是存活对象, 哪些是己经死亡的对象。只有被标记为己经死亡的对象, GC 才会在执行垃圾回收时, 释放掉其所占用的内存空间, 因此这个过程我们可以称为垃圾标记阶段。那么在JVM 中究竟是如何标记一个死亡对象呢? 简单来说, 当一个对象己经不再被任何的存活对象继续引用时, 就可以宣判为己经死亡。判断对象存活一般有两种方式: 引用计数算法 和原创 2020-12-17 19:19:43 · 13514 阅读 · 0 评论 -
002-JVM-什么是垃圾
上一篇:001-JVM-知识点总括 https://blog.youkuaiyun.com/fsjwin/article/details/111304644垃圾就是你先分配了内存,后来这块儿内存不用了。就成了垃圾1. 不同语言分配和回收垃圾的方式1.1 C语言申请malloc 释放free1.2 C++语言申请new 释放内存delete1.3 Java语言申请new ,自动回收2. C&&C++手动回收的问题忘记回收:申请了,但是忘记回收了,内存泄漏。多次回收:释放了两次原创 2020-12-16 22:45:17 · 14589 阅读 · 0 评论 -
001-JVM-知识点总括
JVM总览学习JVM,如果没有对其整体有个一预先的了解,很容易陷入其中,我的想法是,在学习的时候需要“会当凌绝顶,一览众山小”,哈哈,先看一下Jvm的学习总括:(如果觉得下图不够清晰,可以直接访问我画图的连接https://www.processon.com/view/link/5fda194f5653bb06f3452b5e)知道了总览接下来就一个一个的攻克。...原创 2020-12-16 22:31:35 · 14160 阅读 · 1 评论 -
JVM-GC时的安全点Safe Point与安全区域Safe Region
问题的提出:JVM的GC实在任何时刻都会发生吗?先给出答案:不是的,只有stw(stop the world)即用户线程停下来后才会执行,那么用户线程千千万,如何治理呢?有办法,就是此处的安全点和安全区域。1.什么是安全点Safe Point程序执行时并非在所有地方都能停顿下来开始GC , 只有在特定的位置才能停顿下来开始GC , 这些位置称为“ 安全点(Safepoint)。2.安全点的选择安全点的选择很重要, 如果太少可能导致GC 等待的时间太长, 如果太频繁可能导致运行时的性能问题。大部.原创 2020-10-23 20:37:53 · 16464 阅读 · 4 评论 -
JVM-堆中线程私有空间TLAB(Thread Local Allocation Buffer)
问题的提出:堆中的对象是线程共享的,那么在堆中可以有线程私有的空间吗?给出答案:可以,就是TLAB,线程私有,都一份,提高效率、解决线程安全问题。1.为什么有TLAB (Thread Local Allocation Buffer) ?堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。2.TLAB 在堆中的哪里 ?从内存模型而不原创 2020-10-23 20:37:36 · 14344 阅读 · 0 评论
分享