![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java虚拟机
Java Virtual Machine
Wonder丶丶丶
加油,你要学的东西还很多!
展开
-
JVM系列之对象的创建过程
java是一门面向对象的编程语言,在程序运行过程中无时无刻都有对象被创建。对于语言层面来说,创建对象通过new关键字就可以实现,但在JVM层面上伴随着以下的复杂过程:原创 2020-08-02 12:32:56 · 270 阅读 · 0 评论 -
内存模型中的long和double的非原子性协定
long和double的非原子性协定(Nonatomic Treatment of double and long Variable)Java内存模型要求lock、unlock、read、load、assign、use、store、write这8个操作都具有原子性,但是对于64位的数据类型(double、long)定义了相对宽松的规定:允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次的32位操作来进行,即允许虚拟机可以不保证64位数据类型的load、store、read和write原创 2020-07-29 21:46:38 · 573 阅读 · 0 评论 -
JVM系列之类初始化执行类构造器<clinit>()方法时的细节整理
1、非法向前引用变量2、构造方法执行顺序3、接口的构造方法4、多线程的初始化问题原创 2020-07-27 19:02:49 · 411 阅读 · 0 评论 -
String类系列之intern方法
intern方法的使用原创 2020-07-30 14:14:55 · 132 阅读 · 0 评论 -
JVM系列之如何判断对象已死
在堆里存放着Java几乎所有的对象实例,垃圾收集器在对堆内存进行回收前,首先得确定这些对象是否还存活(是否有被引用)。主流的判断方法有两种算法:引用计数算法和可达性分析算法。引用计数算法引用计数是最简单直接的一种方式,这种方式在每一个对象中增加一个引用的计数,每当某一个对象被别的地方引用就把他的引用计数器加上1,如果此对象的引用计数变为0,那么此对象就可以作为垃圾收集器的目标对象来收集。Python语言使用的就是此种算法。优点:简单,直接,不需要暂停整个应用缺点:不能处理对象循环引用的问题原创 2020-11-08 19:49:11 · 158 阅读 · 0 评论 -
JVM系列之字节码解释执行引擎
解释执行基于栈的指令集基于寄存器的指令集基于栈的解释执行过程原创 2020-07-28 16:14:38 · 170 阅读 · 0 评论 -
JVM系列之四种垃圾收集算法
标记-清除算法(Mark-Sweep)这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段:采用从根集合(GC Roots)进行扫描,对需要回收的对象进行标记;清除阶段:回收被标记的对象所占用的空间。问题:1、效率,标记和清除两个过程的效率都不高;2、空间碎片,直接清除掉需要回收的对象之后会产生大量不连续的内存碎片,碎片太多导致之后需要分配大对象时无法找到足够的连续内存,从而增加回收的频率。原创 2020-11-18 20:38:10 · 152 阅读 · 0 评论 -
JVM系列之内存监控工具Java VisualVM
Java VisualVM简称为jvisualvm,在哪里可以找到呢,JDK安装目录下的bin中的jvisualvm.exe或者通过cmd直接打开可以看到以下这些信息安装Visual GC插件打开工具-->插件,发现以下问题进入VisualVM的插件中心,如果进不去请参看解决GitHub无法访问的问题,找到对应JDK版本的插件更新地址修改VisualVM中插件中心的地址为上面的地址发现还是无法访问,退出去重进,发现可以了,安装Visua...原创 2020-11-02 16:07:49 · 190 阅读 · 0 评论 -
Java虚拟机规范、垃圾回收官网原文档地址
Oracle甲骨文官网首页Java语言特性和虚拟机规范HotSpot垃圾收集器HotSpot虚拟机规范原创 2020-08-02 23:43:40 · 292 阅读 · 0 评论 -
JVM系列之对象的访问定位
在对象创建完成后,会有一个对应着堆内存中该对象的引用地址reference存放在局部变量表中,当需要使用该对象时,则通过该reference数据在堆内存中定位。目前主流的访问定位方式有两种:句柄方式、直接指针。句柄方式:堆中维护一个句柄池,句柄包含类型数据指针和对象数据指针(栈中的 reference 指向句柄池中的句柄,句柄指向堆中的实例,句柄指向方法区的类型数据)。此种方式优势为句柄比较稳定,在对象被移动(垃圾收集时移动对象)时,只会改变句柄中的实例指针,而reference不需要改变。但是需要另外原创 2020-08-31 22:07:17 · 178 阅读 · 0 评论 -
JVM系列之双亲委派机制的实现和作用
当某个类加载器需要加载.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类,如下图:下面是java.lang.ClassLoader中loadClass方法的源码,具体实现在其中try/catch那一段。解释为以下:当一个class文件需要被加载时(如果不考虑自定义类加载器),进入AppClassLoader中,首先检查是否加载过,如果有就无需加载了。如果没有,自己先不加载,去调用Extension ClassLoader的l原创 2020-07-26 23:08:35 · 251 阅读 · 0 评论 -
查看当前JVM使用的是那种垃圾收集器
查看当前JVM的垃圾收集器cmd中输入以下命令java -XX:+PrintCommandLineFlags -version然后对照以下参数信息参数 描述 UseSerialGC 虚拟机运行再Client模式下的默认值,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收 UseParNewGC 打开此开关后,使用ParNew+Serial Old的收集器组合进行内存回收 UseConcMarkSweepGC 打开此开关..原创 2020-11-03 18:26:51 · 2535 阅读 · 2 评论 -
JVM系列之七种垃圾收集器
目前HotSpot虚拟机中的垃圾收集器有如下7种,需要明确的是:到目前为止还没有适应所有场景的最好的垃圾收集器,所以在不同的适用场景中需要选择不同的垃圾收集器。原创 2020-11-18 20:36:36 · 274 阅读 · 0 评论 -
JVM系列之内存分配和回收策略
JVM采用分代收集的思想来管理内存,那么在内存回收时就必须能识别哪些对象放在新生代,哪些放在老年代,为此JVM给每个对象定义了对象年龄计数器原创 2020-07-27 20:08:35 · 518 阅读 · 0 评论 -
JVM系列之对象的内存布局
在HotSpot虚拟机中对象在堆内存存储时包含三块区域:对象头、实例数据、对齐填充。原创 2020-08-02 12:32:19 · 205 阅读 · 0 评论 -
JVM系列之类加载机制详解
类加载的全过程包括:装载、验证、准备、解析、初始化这五个阶段,加载的各阶段在开始时间上按上图有固定的先后顺序,但在执行时是相互交叉混合进行,通常是在一个阶段执行过程中调用或激活另一个阶段。原创 2020-07-27 19:03:15 · 169 阅读 · 0 评论 -
JVM系列之常用参数的查看和设置
堆内存JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。堆中内存区域按分代收集算法分为老年代和年轻代,其中老年代Old区默认占堆内存的2/3,年轻代占1/3。年轻代中又分为原创 2020-11-09 19:29:20 · 1584 阅读 · 2 评论 -
JVM系列之栈帧(Stack Frame)结构
栈帧是运行时数据区中虚拟机栈的栈元素,用于支持虚拟机进行方法调用和执行的数据结构,栈帧中储存着局部变量表、操作栈、动态链接、返回地址以及一些额外的附加信息。原创 2020-07-27 22:06:33 · 714 阅读 · 0 评论 -
JVM系列之Class类文件的结构
1、魔数2、常量池3、访问标志4、索引集合5、字段表集合6、方发表集合7、属性表集合原创 2020-07-28 16:09:15 · 169 阅读 · 0 评论 -
java中直接内存(堆外内存)详解
直接内存的概念直接内存的使用直接内存的优势对比直接内存导致的问题原创 2020-07-27 23:46:31 · 284 阅读 · 0 评论 -
JVM系列之运行时数据区
JVM在执行java程序的过程中会把其管理的内存划分为多个数据区域,根据JVM规范中的规定,包括方法区、堆、虚拟机栈、程序计数器、本地方法栈原创 2020-07-27 23:51:10 · 121 阅读 · 0 评论 -
JVM系列之STW机制、安全点SafePoint机制、安全区域SafeRegion机制
一、STW (Stop The World)STW的概念JVM在执行GC垃圾收集或者其他特殊任务(比如分派GC、thread dump、死锁检查等)时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外),表现为全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互。起因在JVM系列之如何判断对象已死中可达性分析需要从GC Roots节点寻找引用链,可作为GC Roots的节点主要为全局引用(常量或静态变量)和执行上下文(本地变量表),如果要追个检查其中的引原创 2020-11-18 19:18:25 · 1744 阅读 · 0 评论