![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM系列
文章平均质量分 74
JVM原理+实战
白云coy
从0到1负责过千万级月活电商平台的系统重构和架构设计,月GMV从1亿到10亿+,QPS从5w到35w。Github开源项目l2cache的贡献者,Star数440+。做过电商平台、Saas平台、业务中台、聚合支付等行业赛道。
展开
-
GC 日志打印策略
生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题。但是可能很多人配置的都不够“完美”,要么是打印的内容过少,要么是输出到控制台,要么是一个大文件被覆盖,要么是……本文带你一步一步,配置一个完美的 GC 日志打印策略打印内容为了保留足够多的“现场证据”,最好是把 GC 相关的信息打印的足够完整。而且你的程序真的不差你GC时打印日志I/O消耗的那点性能打印基本 GC 信息打印 GC 日志的第一步,就是开启 GC 打印的参数了,也是最基本的参数转载 2021-07-14 10:17:09 · 1256 阅读 · 0 评论 -
JVM实战-常见问题分析
1)内存泄漏和内存溢出的区别?内存泄漏:对象无法得到及时的回收,持续占用内存空间,从而造成内存空间的浪费。内存溢出:内存泄漏到一定的程度就会导致内存溢出,但是内存溢出也有可能是大对象导致的。2)Young GC会STW吗?不管什么 GC,都会有 stop-the-world,只是发生时间的长短。3)Minor GC、Major GC和Full GC的区别?Minor GC 指新生代GC。Major GC 指老年代GC。Full GC 指Young GC + Old GC + Met原创 2020-08-10 17:45:39 · 177 阅读 · 1 评论 -
JVM实战-常见Java性能问题分析
前面的文章中列举了常用的工具和命令,下面将结合模拟环境的案例来分析具体的问题。当然真实的线上环境可能十分复杂,并没有模拟环境那么简单,但原理是一样的,问题的表现也是类似的,我们重点是要抓住原理,灵活运用,来解决复杂的线上问题。1)CPU负载过高1、通过 top 命令查看各个进程CPU的使用情况,找出占用CPU资源高的进程ID(pid)2、通过 top -Hp pid 查看该进程下各个线程CPU的使用情况,找出占用CPU资源高的线程ID(tid)3、通过 printf '%x' tid 获取16原创 2020-08-10 17:42:55 · 487 阅读 · 1 评论 -
JVM实战-G1调优
G1调优G1的一个重点是为运行需要大量堆且GC延迟有限的应用程序的用户提供一个解决方案。这意味着堆大小约为6GB或更大,并且稳定且可预测的暂停时间低于0.5秒。1)判断是否需要使用G1收集器?官方描述 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/G1.html#use_cases1、超过50%的Java堆内存被实时数据占用2、对象分配或晋升的速度差异显著3、长时间垃圾收集或压缩暂停(超过0.5到1秒)2)不要手动设原创 2020-08-10 17:39:09 · 3646 阅读 · 5 评论 -
JVM实战-GC日志分析
1)GC日志分析配置GC日志文件参数# 未配置垃圾收集器,则默认使用 ParallelGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log-verbose:gc 在控制台输出GC情况-XX:+PrintGCDetails 在控制台输出详细的GC情况-Xloggc: filepath 将GC日志输出到指定文件中1.1)Parallel GC日志分析参数配置-verbose:gc -XX原创 2020-08-10 17:37:20 · 283 阅读 · 1 评论 -
JVM实战-常用工具
可通过工具来分析GC日志,包含指标:吞吐量及GC暂停平均时间、最大时间、各个时间段的比例、GC发生的原因、次数、时间等。Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和。下载地址 https://www.eclipse.org/mat/downloads.php。官网:https://github.com/alibaba/arthas。原创 2020-08-10 17:34:46 · 1086 阅读 · 1 评论 -
JVM实战-常用命令
查看JVM统计信息,查看类加载、内存、垃圾收集、JIT编译信息。查看线程堆栈信息,可用于分析死锁的情况。实时调整和查看JVM参数。原创 2020-08-10 17:30:35 · 832 阅读 · 1 评论 -
JVM之垃圾回收 Garbage Collect
1、如何确定一个对象是垃圾?想要进行垃圾回收,得先知道什么样的对象是垃圾。1)引用计数法通过记录对象被其他对象引用的个数,来判断对象是不是垃圾。对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾。**缺点:**如果A和B相互持有引用,则会导致永远不能回收。2)可达性分析通过GC Root对象,开始向下寻找,看某个对象是否可达,如果可达,则不是垃圾。什么样对象可作为 GC Root 的对象呢?类加载器、Thread、虚拟机原创 2020-08-10 17:23:13 · 366 阅读 · 2 评论 -
基于字节码指令分析return和finally执行顺序和返回值的问题
1、问题首先上问题,具体如下:1、return 和 finally 语句块执行先后顺序?2、return 返回的值是执行 finally语句块 之前的值,还是 finally语句块 中赋值后的值?2、源码public class ReturnFinallyTest { public static void main(String[] args) { System.out.println(test());// 打印 value } public stati原创 2020-08-07 11:00:30 · 270 阅读 · 0 评论 -
JVM之内存结构分析
一、Java 内存结构Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,只有在Java虚拟机退出时才会被销毁。其他数据区域是每个线程的。每线程数据区域在创建线程时创建,在线程退出时销毁。JVM结构官方文档https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.51、图解运行时数据区2、方法区-Method Area方法区是各个线程共享的内存区域,原创 2020-08-03 15:55:57 · 317 阅读 · 1 评论 -
JVM之类加载器分析
一、类加载机制1、装载 Load查找和导入class文件。1)通过一个类的全限定名获取此类文件的二进制字节流。2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。2、链接 Link2.1)验证 Verify验证被加载的类文件的正确性。文件格式验证元数据验证字节码验证符号引用验证2.2)准备 Prepare为类的静态表里分配内存,并将其初始化为默认原创 2020-08-03 15:52:40 · 128 阅读 · 0 评论 -
JVM之源文件编译和类文件分析
一、源文件编译1、编译1.1)java源文件package com.coy.test.study.jvm;public class User { private String name; private int age; private static String address; private final static String hobby = "Programming"; public void say() { System.out原创 2020-08-03 15:47:29 · 265 阅读 · 1 评论