
jvm
文章平均质量分 74
自驱
ALOHA HEJA HE
展开
-
【OOM】 Linux OS OOM VS JVM OOM
1 错误日志定位----已读服务provider下线已读服务被下线:2 应急解决方案:保存一台机器的gc.log 日志文件,线程其他日志文件等;然后重启服务3 查看下线原因:机器情况 物理内存8G启动了两个java进程 1 通过gc日志排除vm内存泄露; 下图 2 egrep -i "killed process" /var/log/messages -C100OR dmesg -T | grep java -C100 确认是否...原创 2021-03-25 14:57:35 · 498 阅读 · 0 评论 -
【GC】经典垃圾收集器
1HotSpot虚拟机的垃圾收集器2Serial/Serial Old应用场景:对于单核处理 器或处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以 获得最高的单线程收集效率。在用户桌面的应用场景以及近年来流行的部分微服务应用中,分配给虚 拟机管理的内存一般来说并不会特别大,收集几十兆甚至一两百兆的新生代(仅仅是指新生代使用的 内存,桌面应用甚少超过这个容量),垃圾收集的停顿时间完全可以控制在十几、几十毫秒,最多一 百多毫秒以内,只要不是频繁发...原创 2021-03-15 10:21:28 · 102 阅读 · 0 评论 -
【GC】垃圾收安全点,安全域一些列问题
1 安全点涉及词汇Ordinary Object Pointer,OOPOopMap 数据结构存放对象引用。安全点选取:安全点位置的选取基本上是以“是否具有让程序长时间执行的特征”为标准 进行选定的,因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这样的原因而长时间执行,“长时间执行”的最明显特征就是指令序列的复用,例如方法调用、循环跳转、异常跳转 等都属于指令序列复用,所以只有具有这些功能的指令才会产生安全点。2 在垃圾回收时如何让线程在安全点停顿下来?抢先式中断 (Preemp原创 2021-03-14 09:57:38 · 276 阅读 · 0 评论 -
【锁】Synchronized轻量级锁自旋,真的错了?!
1 文章结构Synchronized 相关class文件知识介绍以及加锁流程图 锁升级--本文核心自旋 源码解析 小结2Synchronized 相关class文件知识介绍(多图预警)0 Synchronized底层队列(摘自网络图片)和类源码结构 _cxq 竞争线程首先入队,竞争失败再进入_EntryList堵塞 Blocked 队列节点类型 1 锁和MarkWord关系,自Hotspot wiki 2 网上流传的一张图,摘自网络,这个图流程轻量级锁流程部分有很...原创 2021-03-13 14:55:03 · 641 阅读 · 0 评论 -
【jdk】jdk 本地调试准备--源码下载
1 举例 jdk12为例https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f原创 2021-03-12 11:58:41 · 94 阅读 · 0 评论 -
过招:实现线程安全的方法
1 通常有三种第一种:互斥同步也叫堵塞同步第二种:非堵塞同步第三种:无同步2 对应的实现工具或者思路第一种,互斥同步 使用synchronized Lock来实现。synchronized 曾经有偏向群,轻量级锁,重量级锁三个等级来优化。底层依靠编译器和虚拟机共同完成,也实现了等待队列。底层有三个队列,竞争队列,等待队列,优先队列。JUC的锁就不多说了。脑补。区别一定清清楚楚:三个——中断,公平,锁可以绑定多个条件。详细解释如下:主要有以下三项:等待可中断、可实现公 平锁及锁可以绑定多个条件。原创 2021-03-12 09:36:41 · 152 阅读 · 2 评论 -
【JVM】Synchronized C++ 源码
1 Synchronized 本质本质是对一个对象监视器(monitor)进行获取在Java虚拟机执行到monitorenter指令时,1⃣️首先它会尝试获取对象的锁,如果该对象没有锁,或者当前线程已经拥有了这个对象的锁时,它会把计数器+1;然后当执行到monitorexit 指令时就会将计数器-1;然后当计数器为0时,锁就释放了。2⃣️如果获取锁 失败,那么当前线程就要阻塞等待,直到对象锁被另一个线程释放为止。// monitorbool has_monitor() const { ..原创 2021-03-09 23:48:52 · 472 阅读 · 0 评论 -
【JVM】多图搞明白!基于栈的字节码解释执行引擎
1 基于栈的字节码解释执行引擎public int calc() { int a = 100; int b = 200; int c = 300; return (a + b) * c;}2 多图解释原创 2021-03-06 10:02:20 · 182 阅读 · 0 评论 -
【java】基础 quick review all-in-one
1. JAVA 异常分类及处理1.1 异常分类Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 Exception.1. Error (比如ThreadDeath) 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果 出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。 2. Exception(RuntimeException、CheckedException)又有两个分支,一个是运行时异常 Check原创 2021-02-18 21:27:48 · 200 阅读 · 0 评论 -
【JVM】 jvm quick review知识 all-in-one
1 总体结构2 运行过程:① Java 源文件—->编译器—->字节码文件② 字节码文件—->JVM—->机器码用户线程: 这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。 Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把.原创 2021-02-18 19:25:08 · 206 阅读 · 0 评论 -
【ClassLoader】 类加载器all-in-one
1 类加载器的代理模式--Java 类是否相同两个类是由不同的类加载器实例来加载的,因此不被 Java 虚拟机认为是相同的。了解了这一点之后,就可以理解代理模式的设计动机了。代理模式是为了保证 Java 核心库的类型安全。所有 Java 应用都至少需要引用java.lang.Object类,也就是说在运行的时候,java.lang.Object这个类需要被加载到 Java 虚拟机中。如果这个加载过程由 Java 应用自己的类加载器来完成的话,很可能就存在多个版本的java.lang.Obj...原创 2021-02-17 21:01:31 · 180 阅读 · 0 评论 -
【jvm】中断深入理解,线程池,AQS都在使用的利器
1 线程中断:java中对于中断的大部分操作无外乎以下两点:设置或者清除中断标志位(对运行状态线程需要自检,堵塞状态会抛出异常) 抛出InterruptedException2 设置中断直接看源码 :对上面的两个操作说的很清晰了 /** * Interrupts this thread. * * <p> Unless the current thread is interrupting itself, which is * al原创 2021-01-30 12:38:30 · 372 阅读 · 0 评论 -
【volatile】Java内存模型-volatile型变量的特殊规则
1 是什么?关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制2 特征是什么?什么功能?使用场景?业务上怎么用?当一个变量被定义成volatile之后,它将具备两项特性: 第一项是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知 的。而普通变量并不能做到这一点,普通变量的值在线程间传递时均需要通过主内存来完成。比如, 线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完成了...原创 2021-01-30 02:20:20 · 201 阅读 · 0 评论 -
【jvm】HotSpot的算法细节实现
1根节点枚举 我们以可达性分析算法中从GC Roots集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如 栈帧中的本地变量表)中,尽管目标明确,但查找过程要做到高效并非一件容易的事情。现在可达性分析算法耗时 最长的查找引用链的过程已经可以做到与用户线程一起并发。但根节点枚举始终还 是必须在一个能保障一致性的快照中才得以进行——这里“一致性”的意思是整个枚举期间执行子系统 看起来就像被冻结在某个时...原创 2021-01-30 01:50:43 · 237 阅读 · 0 评论 -
【jvm】垃圾收集算法
1分代收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection) 的理论进 行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分 代假说之上:1)弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。 2)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消 亡。 3)跨代引用假说(Intergen.原创 2021-01-30 01:32:25 · 130 阅读 · 0 评论 -
【jvm】Java内存区域与内存溢出异常
1概述C、C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”, 又是从事最基础工作的劳动人民——既拥有每一个对象的“所有权”,又担负着每一个对象生命从开始 到终结的维护责任。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对 的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不 过,也正是因为Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问 题,如.原创 2021-01-30 01:15:16 · 182 阅读 · 0 评论 -
【CMS】垃圾收集-经典垃圾收集器Concurrent Mark Sweep 详解
1. 介绍CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很 大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为 关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非 常符合这类应用的需求。从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于标记-清除算法实现的,它的运作 过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括..原创 2021-01-30 00:47:36 · 897 阅读 · 0 评论 -
【JVM】JDK 15 Disable and Deprecate Biased Locking 禁用和弃用偏向锁(终于废弃了偏向锁)
Disable and Deprecate Biased Locking 禁用和弃用偏向锁定1 结论Disable biased locking by default, and deprecate all related command-line options.默认情况下禁用偏向锁定,并弃用所有相关的命令行选项。2 GoalsDetermine the need for continued support of the legacy(传统) synchronization optim原创 2021-01-19 19:43:10 · 894 阅读 · 0 评论 -
【Daemon】守护和非守护线程鲜为人知的事实
1 总结(英文+翻译)如下:Non-daemon threads are also known as ‘user’ threads // 非守护程序线程也称为“用户”线程。JVM will not exit even if only 1 non-daemon (i.e. user) thread is alive. On the other hand, JVM will exit even if multiple daemon threads are alive. // 即使只有1个非守护程序(即用户原创 2020-12-11 10:01:50 · 400 阅读 · 1 评论 -
【jvm】do while(0) 为啥被用在宏定义中
1 实例源码openjdk/jdk/src/solaris/native/java/io/io_util_md.h:95/* * Retry the operation if it is interrupted */#define RESTARTABLE(_cmd, _result) do { \ do { \ _result = _cmd; \ } while((_result == -1) && (errno == EINTR)); \}原创 2020-06-14 12:13:28 · 227 阅读 · 0 评论 -
【字节码编程】统计方法执行次数:ASM修改JDK (java/util/regex/Pattern$Loop)class文件
1 java代码private int mcounter = 0;public void do2() {System.out.println(mcounter++);}2 获取ASM源代码 (工具ASMifierClassVisitor)java -classpath /Users/sss/.m2/repository/org/glassfish/hk2/external/...原创 2020-03-26 13:49:02 · 534 阅读 · 0 评论 -
【JVMTI】JVMTI开发教程之一个简单的Agent
JVM TI是JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口(API)。通过JVMTI,我们可以开发各式各样的JVMTI Agent。这个Agent的表现形式是一个以c/c++语言编写的动态共享库。JVMTI Agent原理: java启动或运行时,动态加载一个外部基于JVM TI编写的dynamic module到Java进程内,然后触发JVM源生线程Attac...原创 2020-02-02 21:51:22 · 760 阅读 · 0 评论 -
【JVM-沙箱】java 安全沙箱模型详解
起到第一道安全保障作用的”双亲委派类加载模型”双亲委派方式的类加载,指的是优先从顶层启动类加载器开始,自顶向下的方式加载类的模型(参见第一条类装载器体系结构)。这种模型的好处是,底层的类装载器装载的类无法与顶层类装载器装载的类相互调用。哪怕是同包下的类,只要他们不属于同一类装载器,都是相互隔绝的。这对一些有安全隐患的类起到了安全隔离的作用。使它不能冒充系统类来破坏程序正常运作。此外,...原创 2020-02-02 21:17:12 · 506 阅读 · 0 评论 -
short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?
1 【原理】:2 【命令】javac Main.javajavap -verbose -p Main.class3 【直接贴代码和反编译的指令】:short s1=1;s1=s1+1; 这个肯定被编译器拒绝的! 没有显示的类型转换public class TES { public static void main(String[] args) {...原创 2019-10-18 23:52:42 · 661 阅读 · 0 评论 -
【CPU 和 Load】cpu并未打满,但是load很高,说明可能存在D+R状态的进程导致load高
1 【问题】:这台实例cpu并未打满,但是load很高,其他无异常。2 【理解】:说明可能存在D+R状态的进程导致load高科普:进程的D状态: uninterruptible sleep (不可打断的睡眠状态)举例:Sometimes you will see processes on your linux box that are in D state as shown ...原创 2019-10-13 16:26:01 · 1235 阅读 · 0 评论 -
【故障】oom导致 redis超时 rec 队列打满,导致tomcat拒绝服务
1 现象描述:磁盘占用到了50% 累计 ;PRINT_GC="-XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-PrintHeapAtGC -XX:-UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xlogg...原创 2019-05-20 23:44:32 · 657 阅读 · 0 评论 -
【jvm】---classLoader 双亲委派模型
构造器(jvm加载class文件):1 static 变量 2 static{}语句 顺序执行; 注意: static{} 在前面不能提前引用变量,读取不行,但是可以写。类加载器:双亲委派模型;父类加载器先加载;(是一种组合的关系 , 防止类重复加载,否则可以随便定义如String类 Object类)这种必须使用根类加载器。双亲委派: 1 原因:防止类重复加载;原创 2017-11-05 10:54:36 · 311 阅读 · 0 评论 -
【jvm】-- G1垃圾回收
一,什么是垃圾回收首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象。垃圾回收的基本步骤回收的步骤有2步:查找内存中不再使用的对象释放这些对象占用的内存1,查找内存中不再使用的对象那么问题来了,如何判断哪些对象不再被使用呢?我们也有2个方法:引用计数法引用计数法就是如果一个对象没有被转载 2017-11-18 16:15:24 · 308 阅读 · 0 评论 -
【技能库】--jvm crash 如何开启 core dump 如何分析(280)
1.core dump介绍 程序异常退出(crash)时会自动生成一个core文件,包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理等信息,也就是把程序当时工作的状态存储成一个文件。不仅仅是在出错的时候会生成core dump文件,在系统卡住或者cpu使用率很高的时候也可以手动触发生成core dump文件(当然这种情况也可以直接通过jmap和jstack dump出内转载 2017-08-03 20:49:44 · 5030 阅读 · 0 评论 -
【知识库】--JVM 原理指导(java8 )(208)
1 .class 文件 jvm整体示意2 .class -->到内存3 加载class过程4 内存模型-方法区和堆5 内存模型--pc计数器 栈 本地方法区6 执行器--解释器 ,Just IN Time 编译器 ,hotspot profiler ,GC原创 2017-05-20 14:05:32 · 559 阅读 · 0 评论 -
技能库--线上jvm内存对象分析(137)
机器内存占用排序:ps -eo rss,pmem,pcpu,vsize | sort -k 1 -r -n参考: http://www.cnblogs.com/JemBai/archive/2011/06/21/2086184.htmljinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并原创 2017-03-10 20:38:38 · 777 阅读 · 0 评论