jvm
文章平均质量分 69
CaptainCats
悟已往之不谏、知来者之可追。
展开
-
jvm-09.jvm调优之内存泄漏ML
jvm调优之内存泄漏ML内存泄漏内存泄漏是指一些确实没有用处的对象,因为被其它对象持有引用,无法被回收,造成空间浪费的现象,即对象GC根可达但已无用,内存泄漏是内存溢出的诱因。内存泄漏的本质长生命周期对象持有短生命周期对象的引用举例1:MemoryLeak01package com.duohoob.jvm.gc;public class MemoryLeak01 { Object obj; public void hello() { obj = new Object();原创 2021-07-11 15:26:35 · 151 阅读 · 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.jarFullGC_Problem01是我们刚启动的java进程import java.math.BigDecimal;import java.util.ArrayList;import java.util.Date;import原创 2021-07-10 15:58:11 · 176 阅读 · 0 评论 -
jvm-07.jvm调优之内存溢出OOM
jvm调优之内存溢出OOMjvm调优是在Java虚拟机的命令行参数中挑选出对性能优化有用的值,并顺利且正确地把它设置到一个合适的值,减少GC。jvm命令行参数-X :非标参数,不是所有VM的实现都支持这些配置参数,如-Xmx最大堆、-Xms最小堆;-XX:不稳定参数,这些参数指定虚拟机实例的各种行为,对虚拟机运行时性能有很大影响,如-XX:+UseParNewGc。jdk自带的常用命令jps列出当前系统中的Java进程jinfo 进程号会将Java进程所有详细信息列出来jsta原创 2021-07-10 15:49:12 · 259 阅读 · 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 · 83 阅读 · 2 评论 -
jvm-05.垃圾回收
垃圾回收什么是垃圾jvm中new出来的对象,没有任何引用指向它的时候,它就是垃圾。垃圾的定位引用计数当引用计数变为0的时候就成为垃圾了。但是,引用计数会没有办法定位循环引用的垃圾对象,例如,有三个对象互相引用,但是没有其它外部引用指向它们,它们其实都是垃圾。垃圾抱起团来也是一堆垃圾(笑cry)。可达分析Java采用的是这种方法将"GC Roots"作为起点,从这些节点开始向下搜索引用的对象,整条引用链上的对象都被标记为非垃圾,其余未被标记的对象都是垃圾。GC Roots:线程原创 2021-07-04 14:25:18 · 90 阅读 · 1 评论 -
jvm-04.对象的内存布局
对象的内存布局对象的创建Object o = new Object();内存中有一个变量o指向new出来的对象,蓝色区域代表的就是对象。半初始化问题通过new创建对象时分为三步:第一步申请分配内存,这一步给成员变量赋默认值,第二步调用构造方法,这一步给成员变量赋初始值,第三步建立指针与对象的关联。第二步是为了解决c++ 变量遗留值的问题,是上一个程序访问过这块空间遗留下的值,安全起见先赋默认值。对象的布局普通对象分为4个部分:markword8个字节class poin原创 2021-07-02 22:21:00 · 146 阅读 · 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 · 70 阅读 · 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 · 303 阅读 · 0 评论 -
jvm-02.有序性保证
有序性保证硬件层面有序性保证指令重排提高了运行效率,但也带来了乱序执行数据不一致的问题,在硬件层面如何确保有序性?CPU内存屏障写屏障sfence在sfence指令前的写操作必须在sfence后的写操作之前完成读屏障lfence在lfence指令前的读操作必须在lfence后的读操作之前完成混合屏障mfence在mfence指令前的读写操作必须在mfence后的读写操作之前完成屏障前后的指令不能重排,这是CPU级别的内存屏障。原子指令x86上的"lock"指令,lock…doSth原创 2021-06-30 22:57:10 · 195 阅读 · 0 评论 -
jvm-00.Java从编码到执行
jvm-Java从编码到执行类加载器类加载器将Java.class文件加载到内存类加载和初始化loading类加载器层次双亲委派机制原因:(安全)核心的类库只能有顶级加载器去加载、节约资源,父加载器:上级加载器,不是加载器的加载器。linkingverification验证class文件是否符合jvm规范preparation给静态成员变量赋默认值resolution将类、变量、方法等符号引用(例如class文件常量池中的指向引用)解析为指向内存的直接引用initial原创 2021-06-29 21:22:16 · 180 阅读 · 1 评论