程序猿洞晓
Java中JIT优化中最重要的逃逸分析 Java中JIT优化中最重要的逃逸分析
逃逸分析(Escape Analysis)是一种可以有效减少Java 程序中同步负载和内存堆分配压力的算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。
2022-09-20
Java的即时编译(Just In Time, JIT)及其优化 Java的即时编译(Just In Time, JIT)及其优化
虚拟机会把这些代码编译成本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT编译器,不是Java虚拟机内必须的部分)。
2022-09-20
Java虚拟机那些事儿(十三):Java基本命令jps、jinfo、jstat Java虚拟机那些事儿(十三):Java基本命令jps、jinfo、jstat
没事的时候在回顾自己的博客,刚好这段时间朋友在外面面试,根据他的反馈也做了很多了解。JVM对于Java开发人员来说是面试的重中之重,也是最难的,因为内部的东西太多,没有一个系统的学习方案,都是东一块西一块的学习,最终导致这方面的知识都是由记忆碎片拼接,不全面也不系统。之前的十几篇博客都是转载自其他的博客,接下来还会借鉴别人的博客来完善整个Java虚拟机的知识体系。
2019-07-08
Java虚拟机那些事儿(十二):类加载器 Java虚拟机那些事儿(十二):类加载器
双亲委派模型是描述类加载器之间的层次关系。它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈……
2018-09-13
Java虚拟机那些事儿(十一):类加载的过程 Java虚拟机那些事儿(十一):类加载的过程
“加载”是“类加载”过程的一个阶段,不能混淆这两个名词。在加载阶段,虚拟机需要完成 3 件事。第一通过类的全限定名获取该类的二进制字节流。第二将二进制字节流所代表的静态结构转化为方法区的运行时数据结构。第三在内存中创建一个代表该类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
2018-09-09
Java虚拟机那些事儿(十):类加载的时机 Java虚拟机那些事儿(十):类加载的时机
加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始(注意是“开始”,而不是“进行”或“完成”),而解析阶段则不一定:它在某些情况下可以在初始化后再开始,这是为了支持 Java 语言的运行时绑定。Java 虚拟机规范没有强制约束类加载过程的第一阶段(即:加载)什么时候开始,但对于……
2018-09-05
Java虚拟机那些事儿(九):类文件结构 Java虚拟机那些事儿(九):类文件结构
JVM 只认识 .class 文件,它不关心是何种语言生成了 .class 文件,只要 .class 文件符合 JVM 的规范就能运行。 目前已经有 JRuby、Jython、Scala 等语言能够在 JVM 上运行。它们有各自的语法规则,不过它们的编译器 都能将各自的源码编译成符合 JVM 规范的 .class 文件,从而……
2018-09-04
Java虚拟机那些事儿(八):JVM 性能调优 Java虚拟机那些事儿(八):JVM 性能调优
垃圾收集进行时,虚拟机虽然会对直接内存进行回收, 但是直接内存却不能像新生代、老年代那样,发现空间不足了就通知收集器进行垃圾回收, 它只能等老年代满了后 Full GC,然后“顺便”帮它清理掉内存的废弃对象。 否则只能一直等到抛出内存溢出异常时,先catch掉,再在catch块里大喊 “System.gc()”。要是虚拟……
2018-08-26
Java虚拟机那些事儿(七):内存分配与回收策略 Java虚拟机那些事儿(七):内存分配与回收策略
对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置。大多数情况下,对象在新生代 Eden 区中分配。当 Eden 区没有足够空间进行分配时,虚拟机……
2018-08-20
Java虚拟机那些事儿(六):HotSpot垃圾收集器参数和组合方式 Java虚拟机那些事儿(六):HotSpot垃圾收集器参数和组合方式
图中你可能也注意到了CMS和Serial Old也有连线,因为CMS收集器过程经历了四个阶段分别是初始标记、并发标记、重新标记和并发清除。在经历这四个阶段的时候,如果新的垃圾出现在标记之后,就会无法被清理,会导致浮动垃圾的堆积,只能等待下一次GC过程清理。在CMS的收集过程会预留一部分空间给用户线程运行,这个时候如果出现……
2018-08-11
Java虚拟机那些事儿(五):HotSpot垃圾收集器 Java虚拟机那些事儿(五):HotSpot垃圾收集器
G1是一款面向服务端应用的垃圾收集器,它没有新生代和老年代的概念,而是将堆划分为一块块独立的Region。当要进行垃圾收集时,首先估计每个Region 中垃圾的数量,每次都从垃圾回收价值最大的Region开始回收,因此可以获得最大的回收效率。从整体上看,G1是基于“标记-整理”算法实现的收集器,从局部(两个Region之间)上看到……
2018-08-10
Java虚拟机那些事儿(四):垃圾收集策略与算法 Java虚拟机那些事儿(四):垃圾收集策略与算法
程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于 Java 堆和方法区,我们只有在程序运行期间才能知道会创建哪些对象,这部分内存的分配……
2018-07-31
1 / 2