java 虚拟机(jvm)学习笔记, jmm
java 虚拟机学习笔记
深入学习 java
老马啸西风
Github: https://github.com/houbb
Email:houbinbin.echo@gmail.com
展开
-
JVM-逃逸分析-31 Escape Analysis
逃逸分析逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用例如作为调用参数传递到其他地方中,称为方法逃逸。例子public static StringBuffer craeteStringBuffer(String s1, String s2) { Str...原创 2019-03-27 16:21:28 · 14198 阅读 · 0 评论 -
JVM-锁消除+锁粗化 自旋锁、偏向锁、轻量级锁 逃逸分析-30
自旋锁自旋锁其实就是一个线程自转,空转,什么都不操作,但也不挂起,在那里空循环。空循环的作用就是等待一把锁。自旋锁是明确的会产生竞争的情况下使用的。当竞争存在时,如果线程可以很快获得锁,那么就没有必要在(操作系统)OS层面挂起线程(因为在操作系统层面去挂起,他的性能消耗是非常严重的,因此如果我们能假定他能很快获取锁,就不需要让线程挂起),而是让线程做几个空操作(称为自旋)互斥同步对性能最大的...原创 2019-03-27 16:20:35 · 16247 阅读 · 0 评论 -
JVM-Shenandoah GC-29
JDK 12 如期而至jdk12 下载地址Shenandoah GC则是很有现实意义度 Shenandoah GC。它是 Redhat 主导开发的 Pauseless GC 实现,从大概 2013 年开始研发,终于取得了重要的阶段性成果,与其他 Pauseless GC 类似。Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等。也许了解 Shen...原创 2019-03-27 16:19:44 · 14848 阅读 · 9 评论 -
JVM-动态追踪-28
场景导入程序出问题了,一时看不出问题出在哪里,于是有了以下对话:“Debug一下吧。”“线上机器,没开Debug端口。”“看日志,看看请求值和返回值分别是什么?”“那段代码没打印日志。”“改代码,加日志,重新发布一次。”“怀疑是线程池的问题,重启会破坏现场。”长达几十秒的沉默之后:“据说,排查问题的最高境界,就是只通过Review代码来发现问题。”比几十秒长几十倍的沉默之后:“我...原创 2019-03-27 16:18:46 · 14590 阅读 · 0 评论 -
JVM-GC 日志-27
情境导入产线一个问题:业务系统调用后台超时,问是不是 FULL GC 的问题。查看方式知道 GC 文件的位置···locate xxx.log···知道如何查看 FULL GC 日志cat /XXX/gc.log | grep -a 'Full'| more简单分析直接根据 full gc 的关键词查看。一般在并发较高的系统中会出现这种日志,且几天出现一次。但是...原创 2019-03-27 16:17:20 · 14192 阅读 · 0 评论 -
JVM-GC G1-26
带着问题学习最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题。总体来讲,对于G1我有几个疑惑,希望能够在这篇文章中得到解决。G1出现的初衷是什么?G1适合在什么场景下使用?G1的trade-off是什么?G1的详细过程?如何理解G1的gc日志?G1的调优思路?从问题开始出发学习 serial什么是 serial...原创 2019-03-27 16:16:36 · 14635 阅读 · 0 评论 -
JVM-GC CMS-25
CMS 的问题我觉得这些问题提的非常好,其实不看本篇解答,直接根据问题的角度去学习就足够了。问题带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助。CMS出现的初衷、背景和目的?CMS的适用场景?CMS的trade-off是什么?优势、劣势和代价CMS会回收哪个区域的对象?CMS的GC Root...原创 2019-03-27 16:14:44 · 14205 阅读 · 0 评论 -
JVM-openjdk-24
openjdk直接 github openjdk 下载源代码。—— corba:不流行的多语言、分布式通讯接口—— hotspot:Java 虚拟机—— jaxp:XML 处理—— jaxws:一组 XML web services 的 Java API—— jdk:java 开发工具包—— —— 针对操作系统的部分—— —— share:与平台无关的实现—— langtools...原创 2019-03-27 16:13:31 · 14174 阅读 · 0 评论 -
java 虚拟机(jvm)-22-JVM GC 其他影响垃圾回收的因素
最终确定和弱,软和幻影引用某些应用程序通过使用finalization和weak,soft或phantom引用与垃圾收集进行交互。这些功能可以在Java编程语言级别创建性能工件。一个例子是依靠finalization来关闭文件描述符,这使得外部资源(描述符)依赖于垃圾收集的快速性。依靠垃圾收集来管理内存以外的资源几乎总是一个坏主意。请参阅如何处理Java Finalization的内存保留问...原创 2019-01-05 13:15:48 · 17353 阅读 · 1 评论 -
java 虚拟机(jvm)-21-JVM GC G1 垃圾收集器
Garbage-First Garbage CollectorGarbage-First(G1)垃圾收集器的目标是具有大量内存的多处理器计算机。它试图以高概率满足垃圾收集暂停时间目标,同时在几乎不需要配置的情况下实现高吞吐量。 G1旨在使用当前目标应用程序和环境提供延迟和吞吐量之间的最佳平衡,其功能包括:堆大小最多为10 GB或更大,超过50%的Java堆占用实时数据。对象分配和促销...原创 2019-01-05 13:14:24 · 17745 阅读 · 1 评论 -
java 虚拟机(jvm)-20-JVM GC CMS 垃圾收集器
最常见的 concurrent 收集器大多数并发收集器同时执行部分工作到应用程序,因此他们的名字。 Java HotSpot VM包括两个主要并发的收集器:并发标记扫描(CMS)收集器:此收集器适用于喜欢较短垃圾收集暂停且可以与垃圾收集共享处理器资源的应用程序。垃圾优先(G1)垃圾收集器:此服务器式收集器适用于具有大量内存的多处理器计算机。它以高概率满足垃圾收集暂停时间目标,同时实现高吞吐量...原创 2019-01-05 13:12:39 · 17366 阅读 · 0 评论 -
java 虚拟机(jvm)-19-JVM GC Parallel Collector Java 并行垃圾收集器
The Parallel Collector并行收集器(此处也称为吞吐量收集器)是类似于串行收集器的分代收集器。串行和并行收集器之间的主要区别在于并行收集器具有多个线程,用于加速垃圾收集。使用命令行选项-XX:+UseParallelGC启用并行收集器。默认情况下,使用此选项,可以并行运行次要集合和主要集合,以进一步减少垃圾收集开销。并行收集器垃圾收集器线程数在具有<N>硬...原创 2019-01-03 20:23:50 · 17813 阅读 · 0 评论 -
java 虚拟机(jvm)-18-JVM GC 影响 GC 的因素
影响垃圾收集性能的因素影响垃圾收集性能的两个最重要的因素是总可用内存和专用于年轻代的堆的比例。总堆影响垃圾收集性能的最重要因素是总可用内存。由于集合在代数填满时发生,因此吞吐量与可用内存量成反比。注意以下有关堆的增长和收缩,堆布局和默认值的讨论使用串行收集器作为示例。虽然其他收藏家使用类似的机制,但此处提供的详细信息可能不适用于其他收藏家。有关其他收集器的类似信息,请参阅相应主...原创 2019-01-03 20:22:35 · 17460 阅读 · 0 评论 -
java 虚拟机(jvm)-17-JVM GC 实现
垃圾收集器实现Java SE平台的一个优势是它可以保护开发人员免受内存分配和垃圾收集的复杂性的影响。但是,当垃圾收集是主要瓶颈时,了解实现的某些方面很有用。垃圾收集器对应用程序使用对象的方式做出假设,这些可以反映在可调参数中,可以调整这些参数以提高性能,而不会牺牲抽象的功能。世代垃圾收集对象被认为是垃圾,当运行程序中任何其他活动对象的任何引用无法再访问它时,VM可以重用它的内存。理论上...原创 2019-01-03 20:21:04 · 17386 阅读 · 0 评论 -
java 虚拟机(jvm)-16-Java GC Ergonomics 人体工程学
人机工程学(Ergonomics)人机工程学是Java虚拟机(JVM)和垃圾收集启发式(例如基于行为的启发式)提高应用程序性能的过程。JVM为垃圾收集器,堆大小和运行时编译器提供与平台相关的默认选择。这些选择符合不同类型应用程序的需求,同时需要较少的命令行调整。此外,基于行为的调优动态地优化堆的大小以满足应用程序的指定行为。本节介绍这些默认选择和基于行为的调整。在使用后续部分中描述的更...原创 2019-01-03 20:19:49 · 18450 阅读 · 0 评论 -
[java 虚拟机(jvm)-15-JVM GC 概览
垃圾收集调整简介从桌面上的小型applet到大型服务器上的Web服务,各种各样的应用程序都使用Java平台标准版(Java SE)。为了支持这种多样化的部署,Java HotSpot VM提供了多个垃圾收集器,每个垃圾收集器都旨在满足不同的需求。Java SE根据运行应用程序的计算机的类选择最合适的垃圾收集器。但是,这种选择对于每个应用程序可能都不是最佳的。具有严格性能目标或其他要求的用户...原创 2019-01-03 20:18:13 · 17427 阅读 · 0 评论 -
java 虚拟机(jvm)-14-JVM 运行时期优化
概述JIT即时编译器(JIT=just in time compiler)定义:为了提高热点代码的执行效率,在运行时,虚拟机将把这些代码编译成与 本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器;事实上,现在许多主流的商用虚拟机,都同时包含有解释器与编译器,解释器与编译器两者各有优势。与解释器相比,编译器会将常运行到的代码编译成本地代码区实现,可以获取更高的执行...原创 2019-01-03 20:17:01 · 17747 阅读 · 0 评论 -
java 虚拟机(jvm)-13-JVM 编译时期优化
JVM编译器优化JVM的编译器可以分为三个编译器:1、前端编译器:把.java转变为.class的过程。如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。2、JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1、C2编译器。3、AOT编译器:静态提前编译器,直接将*.java文件编译本地机器代码的过程。Javac编译器Javac编译器本身是由Ja...原创 2019-01-03 20:15:59 · 17439 阅读 · 0 评论 -
java 虚拟机(jvm)-12-JVM 远程执行代码
整体思路如果远程系统需要执行一段代码,但是我们现在又没有入口。可以通过这种方式。实际上对于日志信息,可能某个调用信息没有打印,也可以通过这个方式。代码实现核心代码ByteUtils.javapackage org.jvm;/** * Bytes数组处理工具 */public class ByteUtils { public static int bytes2Int(by...原创 2019-01-03 20:14:40 · 17675 阅读 · 0 评论 -
[java 虚拟机(jvm)-11-JVM 字节码类加载实战
类加载OSGI 学习类加载机制jboss 源码学习 JEE 标准Tomcat 学习经典的类加载机制动态字节码以前使用 spring aop 最多使用的就是动态代理和动态字节码。CBLIBAMS不同 jdk 版本之间的转换Retrotranslator 可以将 1.5 版本的 jdk 转换为以前的 jdk 版本。参考资料《深入理解 jvm》目录java 内存模型入门系列教程...原创 2019-01-03 20:13:16 · 17201 阅读 · 0 评论 -
java 虚拟机(jvm)-10-JVM 字节码执行引擎
Java虚拟机的执行引擎输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。本章主要是从概念模型的角度讲解虚拟机的方法调用和字节码执行。帧栈帧栈是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。每一个帧栈中都包括以下信息:局部变量表(Local Varable Table)、操作数栈(Operand Stack)、动态连接(D...原创 2019-01-02 18:12:18 · 17560 阅读 · 0 评论 -
java 虚拟机(jvm)-09-JVM classloader 类加载器
ClassLoader官方概念,看一下即可。类定义public abstract class ClassLoaderextends Object概念类装入器是负责装入类的对象。类类装入器是一个抽象类。给定类的二进制名称,类装入器应该尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个类对象都包含对定义它的类加载器的引用。数...原创 2019-01-02 18:10:39 · 17274 阅读 · 0 评论 -
java 虚拟机(jvm)-08-JVM Bytecode 字节码指令详解
Bytecode 字节码指令jvm 内部细节本文分为三部分,每一部分都分成几个小节。每个小节都可以单独阅读,不过由于一些概念是逐步建立起来的,如果你依次阅读完所有章节会更简单一些。每一节都会覆盖到Java代码中的不同结构,并详细介绍了它们是如何编译并执行的。变量局部变量JVM是一个基于栈的架构。方法执行的时候(包括main方法),在栈上会分配一个新的帧,这个栈帧包含一组局部变量。这...原创 2019-01-02 18:09:05 · 18092 阅读 · 0 评论 -
java 虚拟机(jvm)-07-JVM class 类文件信息
class 文件查看java 代码package com.github.houbb.jvm.learn;public class Main { public static void main(String[] args) { System.out.println("hello jvm"); }}编译后参看文件>javap -verbose ...原创 2019-01-02 18:07:10 · 17717 阅读 · 0 评论 -
java 虚拟机(jvm)-06-JVM jdk 自带工具 jstack jconsole jvisualvm jmap jinfo
jdk 自带工具在 java 安装目录 bin 下。你可以看到对应的信息,这里有很多 java 为我们提供的工具。$ lsappletviewer.exe* java-rmi.exe* javap.exe* jdb.exe* jmap.exe* jstack.exe* klist.exe* policytool...原创 2019-01-02 18:05:47 · 17355 阅读 · 0 评论 -
java 虚拟机(jvm)-05-JVM 之 Java 类加载机制
一道题目引发的血案首先看一道题目。题目Singleton.javapublic class Singleton { private static Singleton singleton = new Singleton(); public static int count1; public static int count2 = 0; privat...原创 2019-01-02 18:04:02 · 17215 阅读 · 0 评论 -
java 虚拟机(jvm)-04-JVM 学习笔记之 Java 垃圾回收 java gc 详解
GC概念在计算机科学中,垃圾收集(GC)是一种自动内存管理方式。垃圾收集器,或者仅仅是收集器,试图回收垃圾,或者被程序不再使用的对象占用的内存。垃圾收集是John McCarthy在1959年左右发明的,用于简化Lisp中的手动内存管理垃圾收集本质上与手动内存管理相反,手动内存管理要求程序员指定释放和返回内存系统的对象。然而,许多系统使用多种方法的组合,包括堆栈分配和区域推断等其他技术。...原创 2019-01-02 18:02:54 · 17305 阅读 · 1 评论 -
[java 虚拟机(jvm)-03-JVM 学习笔记之 Java 内存溢出
OOM为什么要知道1、内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平;2、通过了解内存溢出的几种常见情况,可以在出现内存溢出的时候快速的定位问题的位置,缩短解决故障的时间。概念内存泄露指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。内存溢出指程序运行过程...原创 2019-01-02 18:00:26 · 17144 阅读 · 0 评论 -
java 虚拟机(jvm)-02-Java 内存模型和 HotSpot 创建对象过程
运行时内存模型相关内容参见 java 运行时内存模型直接内存特征直接内存并非 JVMS 定义的标准 Java 运行时内存。直接内存区域是全局共享的内存区域。直接内存区域可以进行自动内存管理(GC),但机制并不完善。本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。可能出现 OutOfMemoryError 异常。nioJDK1.4 加入了新的 NIO...原创 2019-01-02 17:59:09 · 17240 阅读 · 0 评论 -
java 虚拟机(jvm)-01-java 技术体系概览
Java 技术体系组成部分java 编程语言jvmclass 文件格式API 类库其他三方库JDK 与 JREJDKjava 编程语言、API 类库、JVM开发环境JREJava SE API、JVM运行环境Java技术体系的四大平台(SE,EE,ME,Card)1999年Sun根据应用的领域不同把Java技术划归为三个平台,当时分别称...原创 2019-01-02 17:57:19 · 17211 阅读 · 0 评论 -
java 内存模型入门系列教程-00
目录java 内存模型JSR 133-01java 内存模型数据结构-02java 内存模型缓存和重排序-03java 内存模型顺序一致性-04java 内存模型volatile关键字-05java 内存模型happens before,as-if-serial,synchronization-06java 内存模型 java 锁 ReentrantLock-07java 内存模型...原创 2018-12-12 21:08:43 · 18638 阅读 · 0 评论 -
java 内存模型 jmm 汇总-09
处理器内存模型顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和 JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。分类根据对不同类型读/写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面...原创 2018-12-12 21:05:43 · 18057 阅读 · 0 评论 -
java 内存模型 final 关键字-08
基础知识基本用法修饰类当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。修饰方法使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率...原创 2018-12-12 21:04:44 · 18483 阅读 · 0 评论 -
java 内存模型 java 锁 ReentrantLock-07
锁的释放和获取锁是 java 并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。实例MonitorExample.javaclass MonitorExample { int a = 0; public synchronized void writer() { //1 a++; ...原创 2018-12-12 21:02:20 · 18167 阅读 · 0 评论 -
java 内存模型happens before,as-if-serial,synchronization-06
as-if-serial不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不会改变。编译器、runtime和处理器都必须遵守 as-if-serial 语义。为了遵守 as-if-serial 语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。happe...原创 2018-12-12 21:01:04 · 18711 阅读 · 1 评论 -
java 内存模型volatile关键字-05
volatileJava语言规范第三版中对 volatile 的定义如下:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了 volatile,在某些情况下比锁更加方便。如果一个字段被声明成 volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。语义一旦一个共享变量(类的成员变量、...原创 2018-12-12 20:59:56 · 18121 阅读 · 0 评论 -
java 内存模型顺序一致性-04
数据竞争竞争当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。保证JMM对正确同步的多线程程序的内存一致性做...原创 2018-12-12 20:58:51 · 18132 阅读 · 0 评论 -
java 内存模型缓存和重排序-03
缓存为了提升性能,JVM 做了 2 件事情。缓存+重排序为什么会出现线程可见性问题要想解释为什么会出现线程可见性问题,需要从计算机处理器结构谈起。我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利用率,现代处理器结构...原创 2018-12-12 20:57:56 · 18404 阅读 · 0 评论 -
java 内存模型数据结构-02
内存模型Java内存模型,往往是指Java程序在运行时内存的模型,而Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。运行时内存模型运行时内存模型,分为线程私有和共享数据区两大类,其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含Java堆...原创 2018-12-12 20:56:33 · 18485 阅读 · 0 评论 -
java 内存模型-01-JSR 133
Java Memory Model简介在多处理器系统中,处理器通常有一个或多个内存缓存层,通过加速对数据的访问(因为数据离处理器更近)和减少共享内存总线上的流量(因为许多内存操作可以由本地缓存来满足),提高性能。内存缓存可以极大地提高性能,但是它们带来了许多新的挑战。例如,当两个处理器同时检查相同的内存位置时,会发生什么?在什么条件下它们会看到相同的值?在处理器级别,内存模型定...原创 2018-09-14 12:12:06 · 18396 阅读 · 0 评论