
JVM
文章平均质量分 86
https://docs.oracle.com/javase/specs/index.html
morningcat2018
情深不寿,慧极必伤
展开
-
深入理解Java虚拟机读书笔记--6 HotSpot的算法细节实现
安全点位置的选取基本上是以“是否具有让程序长时间执行的特征”为标准进行选定的,因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这样的原因而长时间执行,“长时间执行”的最明显特征就是指令序列的复用,例如方法调用、循环跳转、异常跳转等都属于指令序列复用,所以只有具有这些功能的指令才会产生安全点。增量更新要破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时,就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。原创 2022-09-01 22:17:45 · 358 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--11 Java与线程
以HotSpot为例,它的每一个Java线程都是直接映射到一个操作系统原生线程来实现的,而且中间没有额外的间接结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议),全权交给底下的操作系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间、该把线程安排给哪个处理器核心去执行等,都是由操作系统完成的,也都是由操作系统全权决定的。用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知到用户线程的存在及如何实现的。.........原创 2022-08-30 21:52:12 · 284 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--10Java内存模型
每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。关于主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存这一类的实现细节,Java内存模型中定义了以下8种操作来完成。处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,...原创 2022-08-30 00:48:45 · 263 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--5垃圾收集器
Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。对应《深入理解Java虚拟机》3.5 3.6 节的内容。......原创 2022-08-24 22:18:19 · 387 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--4垃圾判断 垃圾收集算法
在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。原创 2022-08-24 22:15:31 · 163 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--7 JVM工具
用于生成堆转储快照(一般称为heapdump或dump文件)、查询finalize执行队列、Java堆和方法区的详细信息、空间使用率、当前用的是哪种收集器等。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因。jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(系统定位问题时:知识是基础,数据是依据,工具是手段。原创 2022-08-23 22:51:59 · 455 阅读 · 0 评论 -
JVM规范目录
JVM规范目录1. Introduction2. The Structure of the Java Virtual Machine3. Compiling for the Java Virtual Machine4. The class File Format5. [加载, 链接, 和初始化](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html)5.1. [运行时常量池](https://docs.oracle.com/javase原创 2022-03-20 15:18:58 · 652 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--3Java内存管理
深入理解Java虚拟机读书笔记--3Java内存管理运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时数据区Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域:程序计数器线程私有程序计数器(Program Counter Register)是一块较小的内存空间;在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需原创 2022-03-19 10:39:07 · 1035 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--2类加载器
深入理解Java虚拟机读书笔记--2类加载器简介类与类加载器三层类加载器启动类加载器(Bootstrap Class Loader)扩展类加载器(Extension Class Loader)应用程序类加载器(Application Class Loader)双亲委派模型破坏双亲委派模型对应《深入理解Java虚拟机》7.4节的内容简介Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的原创 2022-03-18 01:07:10 · 327 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记--1类加载的过程
加载阶段通过一个类的全限定名来获取定义此类的二进制字节流从ZIP压缩包中读取 例如 加载jar包和war包从网络中获取,这种场景最典型的应用就是Web Applet运行时计算生成,这种场景使用得最多的就是动态代理技术,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass()来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流由其他文件生成,典型场景是JSP应用,由JSP文件生成对应的Class文件可以从加密原创 2022-03-16 21:47:38 · 1209 阅读 · 0 评论 -
Java 访问标志概要
访问标志访问标志值类方法字段0x0001publicpublicpublic0x0002privateprivate0x0004protectedprotected0x0008staticstatic0x0010finalfinalfinal0x0020super 一直为truesynchronized0x0040bridge 编译器产生的桥接方法volatile0x0080transient原创 2021-06-09 09:12:06 · 162 阅读 · 0 评论 -
JVM学习笔记21 java 工具
bilibili-JVM学习笔记21 java 工具The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记18 字节码知识总结JVM学习笔记19 JVM内存空间JVM学习笔记20 jvisualvm基于 java 1.8.0jmap与jstat工具实战分析 67➜ ~ jmap -hUsage: jmap [option] <pid> (to connect to running原创 2020-06-19 16:45:08 · 203 阅读 · 0 评论 -
JVM学习笔记24 CMS 垃圾收集器
bilibili-JVM学习笔记24 CMS 垃圾收集器The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记18 字节码知识总结JVM学习笔记19 JVM内存空间JVM学习笔记20 jvisualvmJVM学习笔记21JVM学习笔记22 垃圾回收理论知识JVM学习笔记23内存泄漏 和 VM参数设置基于 java 1.8.0安全点与安全区域详解 83Concurrent Mark Sweep --> CMS原创 2020-06-18 14:50:17 · 235 阅读 · 0 评论 -
JVM学习笔记23内存泄漏 和 VM参数设置
bilibili-JVM学习笔记23The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记18 字节码知识总结JVM学习笔记19 JVM内存空间JVM学习笔记20 jvisualvmJVM学习笔记21JVM学习笔记22 垃圾回收理论知识基于 java 1.8.0Java内存泄露经典原因分析 77Java 内存泄漏的经典原因对象定义在错误的范围(Wrong Scope)异常(Exception)处理不当集合原创 2020-06-17 15:51:35 · 321 阅读 · 0 评论 -
JVM学习笔记22 垃圾回收理论知识
bilibili-JVM学习笔记22 垃圾回收算法The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记18 字节码知识总结JVM学习笔记19 JVM内存空间JVM学习笔记20 jvisualvm基于 java 1.8.0JVM垃圾回收重要理论剖析 74运行时区域程序计数器 PC本地方法栈Java虚拟机栈 (JVM Stack)Java 虚拟机栈描述的是 Java 方法的执行模型:每个方法执行的时候原创 2020-06-16 15:56:33 · 285 阅读 · 0 评论 -
JVM学习笔记20 jvisualvm
bilibili-JVM学习笔记20 jvisualvmThe Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记18 字节码知识总结JVM学习笔记19 JVM内存空间基于 java 1.8.0实战 jvisualvmpackage new_package.jvm.p62;import java.util.ArrayList;import java.util.List;/** * -Xms5m -Xmx5m -X原创 2020-06-15 16:22:46 · 247 阅读 · 0 评论 -
JVM学习笔记19 JVM内存空间
bilibili-JVM学习笔记19 JVM内存空间The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记18 字节码知识总结JVM内存空间划分与作用详解原创 2020-06-13 18:12:42 · 182 阅读 · 0 评论 -
JVM学习笔记18 字节码知识总结
bilibili-JVM学习笔记18 字节码知识总结The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记11 - Java字节码初识JVM学习笔记12 - 解读笔记11中的attributesJVM学习笔记13JVM学习笔记14 异常JVM学习笔记15 方法执行JVM学习笔记16 字节码执行JVM学习笔记17 动态代理运作机制字节码知识总结...原创 2020-06-13 18:08:08 · 233 阅读 · 0 评论 -
JVM学习笔记17 动态代理运作机制
bilibili-JVM学习笔记17 动态代理运作机制The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记11 - Java字节码初识JVM学习笔记12 - 解读笔记11中的attributesJVM学习笔记13JVM学习笔记14 异常JVM学习笔记15 方法执行JVM学习笔记16透过字节码生成审视Java动态代理运作机制package new_package.jvm.p57;public interface原创 2020-06-13 17:32:22 · 224 阅读 · 0 评论 -
JVM学习笔记16 字节码执行
bilibili-JVM学习笔记16The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记11 - Java字节码初识JVM学习笔记12 - 解读笔记11中的attributesJVM学习笔记13JVM学习笔记14 异常JVM学习笔记15 方法执行编译执行 解释执行现代 JVM 在执行 Java 代码的时候,通常都会将解释执行与编译执行二者结合起来进行;解释执行通过 jvm 解释器来读取字节码,遇到相应的字原创 2020-06-13 16:18:52 · 261 阅读 · 0 评论 -
JVM学习笔记15 方法执行
bilibili-JVM学习笔记15 方法执行The Java Virtual Machine Specification - Java SE 8 EditionJVM学习笔记11 - Java字节码初识JVM学习笔记12 - 解读笔记11中的attributesJVM学习笔记13JVM学习笔记14 异常栈帧 stack frame栈帧是一种用于帮助虚拟机执行方法调用与方法执行的数据结构;方法的局部变量表动态链接信息符号引用直接引用方法的返回地址操作数栈一个栈帧只会原创 2020-06-12 20:17:30 · 169 阅读 · 0 评论 -
JVM学习笔记14 异常
bilibili-JVM学习笔记14 异常JVM学习笔记11 - Java字节码初识JVM学习笔记12 - 解读笔记11中的attributesJVM学习笔记13P49 异常处理1 try catch异常处理2 throw原创 2020-06-11 13:46:10 · 246 阅读 · 0 评论 -
JVM学习笔记13 synchronized
bilibili-JVM学习笔记13JVM学习笔记11 - Java字节码初识JVM学习笔记12 - 解读笔记11中的attributes实例方法加 synchronizedpackage new_package.jvm.p46;public class SynchronizedTest1 { private int i = 0; public synchronized void test1() { i++; System.out.printl原创 2020-06-10 20:15:52 · 199 阅读 · 0 评论 -
JVM学习笔记12 - 解读笔记11中的attributes
bilibili-JVM学习笔记12 - 解读笔记11中的attributesJVM学习笔记11 - Java字节码初识4.7. Attributes附加属性attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length];}Table 4.7-A. Predefined class file attributes (by section)Attri原创 2020-06-09 23:53:20 · 770 阅读 · 0 评论 -
番外 GC算法
引用计数算法:最初的算法现代虚拟机大多已弃用此算法导致循环引用效率高可达性分析算法/根搜索算法:HotSpotGC Roots虚拟机栈的栈帧的局部变量表所引用的对象本地方法栈的JNI所引用的对象方法区的静态变量和常量所引用的对象可达性图论什么时候进行垃圾回收:当 eden 区或者 S 区(包括 s0 和 s1 ,又称 from 和 to 区)不够用时当老年代不够用时当方法区不够用时System.gc()标记清除算法先标记(根据可达性分析算原创 2020-06-06 16:56:30 · 150 阅读 · 0 评论 -
DCL 为什么还需要 volatile
DCLDouble-checked locking 双重检查锁定模式双重检查锁定模式首先验证锁定条件(第一次检查),只有通过锁定条件验证才真正的进行加锁逻辑并再次验证条件(第二次检查)。为多线程环境中的单例模式实现“惰性初始化”。// Broken multithreaded version// "Double-Checked Locking" idiomclass Foo { private Helper helper = null; public Helper getHelp转载 2020-05-08 19:53:01 · 1356 阅读 · 0 评论 -
JVM学习笔记11 - Java字节码初识
bilibili-深入理解JVM 虚拟机 学习笔记JVM学习笔记 1JVM学习笔记 2JVM学习笔记 3JVM学习笔记 4JVM学习笔记 5JVM学习笔记 6JVM学习笔记 7JVM学习笔记 8JVM学习笔记 9JVM学习笔记 10P37_Java字节码文件结构剖析(37)Java 之所以跨平台是因为 JVM 不是跨平台的;java 编译器在任何平台(Linux、Unix、...原创 2020-05-06 20:52:46 · 368 阅读 · 0 评论 -
java 中锁的种类的梳理
java 中锁的种类的梳理公平锁、非公平锁公平锁:按申请锁的顺序去分配锁;公平锁会降低吞吐量;非公平锁会造成优先级反转或者饥饿现象;synchronized 是一种非公平锁;并且没有任何办法使其变成公平锁java.util.concurrent.locks.ReentrantLock : 支持设置是否为公平锁(通过 AQS 实现线程调度)java.util.concurrent.l...原创 2020-04-30 22:27:11 · 153 阅读 · 0 评论 -
JVM学习笔记10 - 类加载器总结
bilibili-深入理解JVM 虚拟机 学习笔记JVM学习笔记 1JVM学习笔记 2JVM学习笔记 3JVM学习笔记 4JVM学习笔记 5JVM学习笔记 6JVM学习笔记 7JVM学习笔记 8JVM学习笔记 9P32_JVM类加载器阶段性总结与学习方式升级(32)...原创 2020-04-30 21:19:12 · 195 阅读 · 0 评论 -
JVM学习笔记9
bilibili-深入理解JVM 虚拟机 学习笔记JVM学习笔记 1JVM学习笔记 2JVM学习笔记 3JVM学习笔记 4JVM学习笔记 5JVM学习笔记 6JVM学习笔记 7JVM学习笔记 8P27_线程上下文类加载器分析与实现(27)当前类加载器每个类都会使用自己的类加载器(加载当前类的类加载器)去加载自己所依赖的(且还未加载的)类。线程上下文类加载器(context...原创 2020-04-29 16:07:54 · 260 阅读 · 0 评论 -
JVM学习笔记8
P25_Launcher类源码分析(25)tip : 本机安装的 jdk 版本为 adoptopenjdk1.8 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();java.lang.ClassLoader public static ClassLoader getSystemClassL...原创 2020-04-29 14:35:26 · 206 阅读 · 0 评论 -
JVM学习笔记7
P19_自定义类加载器在复杂类加载情况下的运行分析(19)略P20_类加载器命名空间实战剖析与透彻理解(20)子加载器可以委托父加载器去加载某个类,但父加载器却不能委托子加载器去加载类;当加载器在加载的类里有引用别的类需要加载时,如果此被引用的类是需要子类加载器则就会报错;命名空间每个类加载器都有自己的命名空间,命名空间由该类加载器和所有父加载器所加载的类组成(但不包含子类所加载的类...原创 2020-04-27 16:37:26 · 722 阅读 · 0 评论 -
JVM学习笔记 番外5 CAS
CASCAS (compare and swap) 比较和替换value 等于 value2不相等开始读取当前值value使用value做入参进行运算得到result重新获取当前值value2将值更新为result结束ABA问题value2 虽然等于 value ,但其实中间有过变化 只是最后结果和当初的结果没有变化而已;如果业务只关注结果值,可以当做什么也没发生;如果需要注意这种情况...原创 2020-04-27 10:53:14 · 236 阅读 · 0 评论 -
JVM学习笔记 番外4 - synchronized 锁状态
JOL mark word 锁状态锁状态简述:偏向锁位 1bit锁标志位 2bit锁状态001无锁态(new)101偏向锁-00轻量级锁(自旋锁、无锁)-10重量级锁-11GC 标记import org.openjdk.jol.info.ClassLayout;public class SynchronizedTe...原创 2020-04-26 14:20:21 · 501 阅读 · 0 评论 -
JVM学习笔记 番外3 - java object header
JVM学习笔记6 番外 java object header背景本想学习一下 java synchronized 关键字的底层原理,就想先写点代码用一下 synchronized:package new_package.jvm.sync;public class SynchronizedTest { Object lock1 = new Object(); publi...原创 2020-04-25 23:05:51 · 590 阅读 · 0 评论 -
JVM学习笔记 番外2 - 类加载器的一些梳理
JVM学习笔记5 番外 类加载器的一些梳理类加载器的双亲:类加载器中的父子关系,并不是 java 对象中的继承关系;双亲委派机制的意义:避免类的重复加载,当父加载器已经加载过了就不会再加载了,保证每个类对象只有一份;保证 java 核心 API 的安全性,避免被篡改若网络中有一个类 java.lang.Object 被要求加载进内存,子类加载器会委派给双亲加载器直至到 boo...原创 2020-04-23 23:21:17 · 137 阅读 · 0 评论 -
JVM学习笔记 番外1 - 系统属性
通过 System.getProperties 确定当前的系统属性。public static Properties getProperties()将 getProperty(String) 方法使用的当前系统属性集合作为 Properties 对象返回。如果没有当前系统属性集合,则先创建并初始化一个系统属性集合。这个系统属性集合总是包含以下键的值:键相关值的描述java...原创 2020-04-22 17:00:33 · 134 阅读 · 0 评论 -
JVM学习笔记6
bilibili-深入理解JVM 虚拟机 学习笔记P16_类加载器重要方法详解(16)public abstract class ClassLoader { // ... protected Class<?> findClass(String name) throws ClassNotFoundException { throw new ClassN...原创 2020-04-24 00:47:39 · 206 阅读 · 0 评论 -
JVM学习笔记5
bilibili-深入理解JVM 虚拟机 学习笔记P14_ClassLoader源码分析与实例剖析(14)类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。每个 Class 对象都包含一个对定义它的 ClassLoader 的引用。...原创 2020-04-23 00:03:15 · 137 阅读 · 0 评论 -
JVM学习笔记4
bilibili-深入理解JVM 虚拟机 学习笔记P11 _类加载器双亲委托机制详解(11)根类加载器加载 $JAVA_HOME/jre/lib/rt.jar 中的所有 class 文件加载 -Xbootclasspath 指定的 jar 包是最高层的加载器,没有父加载器由 C++ 实现,不是 ClassLoader 的子类拓展类加载器加载 $JAVA_HOME/jre/...原创 2020-04-22 01:41:04 · 186 阅读 · 0 评论