
jvm
文章平均质量分 69
CaptainCats
悟已往之不谏、知来者之可追。
展开
-
jvm-09.jvm调优之内存泄漏ML
jvm调优之内存泄漏ML 内存泄漏 内存泄漏是指一些确实没有用处的对象,因为被其它对象持有引用, 无法被回收,造成空间浪费的现象, 即对象GC根可达但已无用,内存泄漏是内存溢出的诱因。 内存泄漏的本质长生命周期对象持有短生命周期对象的引用 举例1: MemoryLeak01 package com.duohoob.jvm.gc; public class MemoryLeak01 { Object obj; public void hello() { obj = new Object();原创 2021-07-11 15:26:35 · 198 阅读 · 2 评论 -
jvm-08.jvm调优工具Arthas
jvm调优工具Arthas阿尔萨斯 官方文档 https://arthas.aliyun.com/doc/ 下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 启动 java -jar arthas-boot.jar FullGC_Problem01是我们刚启动的java进程 import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import原创 2021-07-10 15:58:11 · 212 阅读 · 0 评论 -
jvm-07.jvm调优之内存溢出OOM
jvm调优之内存溢出OOM jvm调优 是在Java虚拟机的命令行参数中挑选出对性能优化有用的值, 并顺利且正确地把它设置到一个合适的值, 减少GC。 jvm命令行参数 -X :非标参数,不是所有VM的实现都支持这些配置参数, 如-Xmx最大堆、-Xms最小堆; -XX:不稳定参数,这些参数指定虚拟机实例的各种行为, 对虚拟机运行时性能有很大影响,如-XX:+UseParNewGc。 jdk自带的常用命令 jps 列出当前系统中的Java进程 jinfo 进程号 会将Java进程所有详细信息列出来 jsta原创 2021-07-10 15:49:12 · 316 阅读 · 0 评论 -
jvm-06.垃圾回收器
垃圾回收器 jvm一共诞生了十种垃圾回收器 分代模型 6种 年轻代 3种 ParNew、Serial、Parallel Scavenge。 老年代 3种 CMS、Serial Old、Parallel Old。 分区模型 3种 G1、ZGC、Shenandoah。 jdk1.8默认的垃圾回收器 java -XX:+PrintCommandLineFlags -version 代表的是年轻代的Parallel Scavenge和老年代的Parallel Old, 简称PS+PO。 年轻代的GC叫mino原创 2021-07-04 21:23:51 · 123 阅读 · 2 评论 -
jvm-05.垃圾回收
垃圾回收 什么是垃圾 jvm中new出来的对象,没有任何引用指向它的时候,它就是垃圾。 垃圾的定位 引用计数 当引用计数变为0的时候就成为垃圾了。 但是,引用计数会没有办法定位循环引用的垃圾对象, 例如,有三个对象互相引用, 但是没有其它外部引用指向它们,它们其实都是垃圾。 垃圾抱起团来也是一堆垃圾(笑cry)。 可达分析 Java采用的是这种方法 将"GC Roots"作为起点,从这些节点开始向下搜索引用的对象, 整条引用链上的对象都被标记为非垃圾,其余未被标记的对象都是垃圾。 GC Roots:线程原创 2021-07-04 14:25:18 · 108 阅读 · 1 评论 -
jvm-04.对象的内存布局
对象的内存布局 对象的创建 Object o = new Object(); 内存中有一个变量o指向new出来的对象, 蓝色区域代表的就是对象。 半初始化问题 通过new创建对象时分为三步: 第一步申请分配内存,这一步给成员变量赋默认值, 第二步调用构造方法,这一步给成员变量赋初始值, 第三步建立指针与对象的关联。 第二步是为了解决c++ 变量遗留值的问题, 是上一个程序访问过这块空间遗留下的值,安全起见先赋默认值。 对象的布局 普通对象 分为4个部分: markword 8个字节 class poin原创 2021-07-02 22:21:00 · 193 阅读 · 1 评论 -
jvm-03.jvm内存模型
jvm内存模型 Math类 package com.duohoob.jvm.test; @SuppressWarnings("unused") public class Math { private final int i = 123; private static String str = "abc"; public int compute() { int a = 1; int b = 2; int c = (a + b)* 10; return c; } publi原创 2021-07-02 20:43:30 · 92 阅读 · 0 评论 -
jvm-01.指令重排
指令重排 指令的执行的5个阶段 几乎所有冯▪诺伊曼型计算机CPU,一条指令的执行都可以分为5个阶段: 1、取指令IF; 2、译码和读存取数(读操作数)ID; 3、执行指令EX; 4、存储器访问(计算结果加载到内存)MEM; 5、结果写回(寄存器)WB; 这其中的每一步都交由不同的硬件处理, 同样的步骤需要等待硬件空闲才能继续运行,也就是: 两条连续执行的指令需要消耗至少6个时钟单位。 A=B+C,需要执行4个指令 Java中的代码:A=B+C,需要执行4个指令: 指令1:加载B到寄存器里的R1中; 指令2原创 2021-06-30 22:56:48 · 352 阅读 · 0 评论 -
jvm-02.有序性保证
有序性保证 硬件层面有序性保证 指令重排提高了运行效率,但也带来了乱序执行数据不一致的问题, 在硬件层面如何确保有序性? CPU内存屏障 写屏障sfence 在sfence指令前的写操作必须在sfence后的写操作之前完成 读屏障lfence 在lfence指令前的读操作必须在lfence后的读操作之前完成 混合屏障mfence 在mfence指令前的读写操作必须在mfence后的读写操作之前完成 屏障前后的指令不能重排,这是CPU级别的内存屏障。 原子指令 x86上的"lock"指令,lock…doSth原创 2021-06-30 22:57:10 · 226 阅读 · 0 评论 -
jvm-00.Java从编码到执行
jvm-Java从编码到执行 类加载器 类加载器将Java.class文件加载到内存 类加载和初始化 loading 类加载器层次 双亲委派机制 原因:(安全)核心的类库只能有顶级加载器去加载、节约资源, 父加载器:上级加载器,不是加载器的加载器。 linking verification 验证class文件是否符合jvm规范 preparation 给静态成员变量赋默认值 resolution 将类、变量、方法等符号引用(例如class文件常量池中的指向引用)解析为指向内存的直接引用 initial原创 2021-06-29 21:22:16 · 211 阅读 · 1 评论