![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 65
苏雨丶
擅长主流开源框架源码
展开
-
记录一下工作中遇到的生产bug以及整个解决过程
今天测试过来问assert服务是不是崩了,所有设计到该服务的接口前端请求都直接超时了,在服务器上通过观察日志发现服务在批量更新站点公式后,才不正常的,一开始以为是更新公式比较耗资源,导致服务器的负载和cpu过高,导致的系统卡死。呆着这样的猜测去验证自己的猜想。于是使用命令来观察服务内存和cpu的占用情况,发现负载和cpu都是正常于是通过命令查看服务的堆栈信息,查看几乎所有线程都处于WAITING状态为了方便观察,于是对其中一个节点进行堆转储,将文件到导到本地的jvisualvm上查看,通过观察线程的原创 2022-06-14 19:49:14 · 298 阅读 · 0 评论 -
Java服务,CPU100%问题如何快速定位?
JVM线上问题排查前言项目运行中,难免会遇到一些问题,有时候cpu占用特别高,有时候内存特别高,出现这样的问题,我们该如何怎么解决,现在我们就从下面示例代码来演示,如何定位到是哪个线程造成的,造成的原因是啥。示例代码public class Deadlock { public static void main(String[] args) throws InterruptedException { Object o = new Object(); new原创 2021-01-18 10:16:28 · 319 阅读 · 1 评论 -
JVM调优常用参数
最重要的一个参数-XX:+PrintFlagsFinal 可以列出所有的调优参数# 假如我们要查G1相关参数只需要执行下面这个命令java -XX:+PrintFlagsFinal | grep G1通用参数-Xmn:设置年轻代大小(eg:-Xmn2G)-Xms:最小堆大小(eg: -Xms4G)-Xmx:最大堆大小(最大堆和最小堆建议设置一样)-Xss:栈大小(eg:-Xss1024K)-XX:+UseTLAB:设置开启线程本地分配,默认是开启的 不建议动-XX:+Pri原创 2020-07-16 17:27:14 · 265 阅读 · 0 评论 -
JVM面试题附带答案
1.JVM运行时结构,各个区存放的数据按线程可见性来分可以分为下面这两类线程共享堆区:堆用来存放数组和对象,内部又分为了新生代和老年代,他们的比例默认为1:2,新生代又分为了一个Eden和两个Survivor,默认比例为8:1:1方法区:用来存放类的方法、属性、字符串常量池、静态变量等。在1.7的时侯,字符串常量和静态变量都放在永久代,在1.8的时候移除了永久代,永久代在启动之前必须制定初始大小,FGC还不会对它进行垃圾回收,新加入了元空间(MetaSpace),将原本存放在永久代的数据全部移原创 2020-07-09 21:32:20 · 4715 阅读 · 0 评论 -
JVM运行时数据区、类加载机制、双亲委派
JVM运行时数据区、类加载机制、双亲委派前言我们先讲一下Java运行时的数据区,类加载机制,双亲委派,然后再开始讲各个垃圾回收器,每个回收器使用的垃圾回收算法,回收的过程,以及JVM的性能调优Java运行时数据区为了方便大家理解JVM的结构,我画了这个图,方便大家理解JVM运行时的数据区线程共享堆区堆区又分为了老年代和新生代,新生代和老年代的内存空间默认比例为1:2,新生代又分为了一个Eden和两个Survivor区(这两个幸存区有些地方叫From和To,还有的资料叫S0和S1)Eden原创 2020-07-08 22:07:57 · 154 阅读 · 0 评论 -
垃圾回收基础理论
垃圾没有任何引用指向的对象都是垃圾找垃圾的方法引用计数法:一个对象创建时会分配一个计数器,有引用指向这个对象时,计数器+1,当引用失效,计数器-1,当计数器为0时,就可以判断为一个垃圾对象(这种方法解决不了循环引用的问题)根可达算法:以GC Roots为根展开引用链路搜索,如果一个对象没有任何链路跟GC Roots关联,那么就可以判断为一个垃圾对象GC Roots的对象:线程栈变量,静态变量,常量池,JNI指针(本地方法对象)垃圾清除的算法标记清除算法:优点:标记处垃圾对象后清原创 2020-07-03 09:47:42 · 291 阅读 · 0 评论 -
i++和 ++i的区别
前言我们平常工作中对某个数进行累加的时候,一般都是用i++,但是我看HashMap和其他一些jdk里面的代码,用到自增基本上用的都是++i,这两个有啥区别呢?我们都知道一个是i++先赋值再自增, 另一个是先自增再赋值。我们只知其然,不知其所以然。今天我尝试给大家解释一下,希望我能表达清楚吧。测试代码首先列出我们的测试代码,你可以想一下这个i会打印几。i++ public static void main(String[] args) { int i = 8;原创 2020-07-02 18:42:48 · 1420 阅读 · 3 评论 -
Java类加载机制 双亲委托模式
加载阶段类加载阶段是由类加载器负责根据一个类的全名类读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区内,然后将其转换为一个与目标类型对应的java.lang.Class对象实例,这个Class对象在日后就会作为方法区中的该类的各种数据的访问入口。JVM支持两种类型的类加载器,分别为引导类加载器(BootStrap ClassLoader) 和自定义类加载器(User-Def...原创 2019-12-02 14:18:16 · 268 阅读 · 0 评论