![](https://img-blog.csdnimg.cn/2020122018374496.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM从入门到精通
文章平均质量分 95
JVM入门级class文件格式,详解Class加载过程,双亲委派机制,编译执行与解释执行,热加载的实现原理,Java内存模型,缓存行,指令重排,合并写技术等等等
寒泉Hq
当你试图解决一个你不理解的问题时,复杂化就产生了
展开
-
灵魂拷问:用移位来代替除法运算真的效率高吗?Java 编译器到底有没有做除法优化?
引入我们知道,相比移位运算,除法运算的开销比较大。在 Leetcode 做题的时候,当除数是 2的 n 次幂时,大家通常会用移位来代替除法运算,并且希望这样能够提升运算效率——这似乎已成为了算法题解中的“标配”。那么问题来了,使用移位操作代替乘除运算,真的效率更高吗?对于这个灵魂拷问,本文分别以 C++ / Java 为例,从汇编层面带你一探究竟。C++ 编译器对除法的优化在 Optimizations in C++ Compilers [中文译文在此] 这篇文章中,作者建议不要在代码中用原创 2021-07-02 17:06:45 · 57310 阅读 · 17 评论 -
Difference between JVM‘s LookupSwitch and TableSwitch | Java 对 switch 的优化:LookupSwitch 与 TableSwitch
QuestionI have some difficulty to understand LookUpSwitch and TableSwitch in Java bytecode.If I understand well, both LookUpSwitch and TableSwitch correspond to the switch statement of Java source? Why one JAVA statement generates 2 different bytecodes?原创 2021-07-01 19:53:35 · 49762 阅读 · 0 评论 -
JVM从入门到精通(十一): CMS日志详解,G1日志详解,JVM常见参数总结;补充纤程知识
CMS 日志格式分析使用CMS:添加参数UserConcMarkSweepGC(CMS+ParNew)CMS常用参数-XX:+UseConcMarkSweepGC-XX:ParallelCMSThreadsCMS线程数量-XX:CMSInitiatingOccupancyFraction使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld卡顿,应该调小,(但是调小的缺点是频繁CMS回收),这个参数可能会问到,你不背下来,只要知道有这么个参数可以调,就原创 2020-07-02 15:33:33 · 66484 阅读 · 3 评论 -
JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法
CMS并发回收,工作线程和GC线程同时进行,暂停时间短老年代分为 四个阶段:初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长并发标记:垃圾回收线程和工作线程同时执行。一边产生垃圾,一边标记(最耗时的阶段,不过是并发的)重新标记:STW,对并发标记的过程中新产生的垃圾进行重新标记 / 取消标记并发清理:清理的过程也会产生新的“浮动垃圾”,需要等下一次CMS重新运行的时候再次清理CMS 存在的 问题:Memory Fragmentation 内存碎片问题原创 2020-07-01 16:05:14 · 66434 阅读 · 0 评论 -
JVM从入门到精通(九):JVM调优实战 - arthas 的使用
Arthas 文档https://github.com/alibaba/arthas/blob/master/README_CN.md运行起来我们的java程序启动 arthas 的 jar 文件,我们看到 刚才运行的java程序的进程号是 1,所以敲进进程号 1 ,回车,它会把自己挂到这个进程上之后就可以用 arthas 提供的一些命令,来观察你的程序了使用 help 查看 arthas 常用命令:一些常用命令,包括:jvm,dashboard,heapdump等等有了arthas,原创 2020-06-30 18:18:48 · 68388 阅读 · 0 评论 -
JVM从入门到精通(八):JVM调优实战
案例1:系统CPU经常100%,如何调优?推理过程是:CPU100%,那么一定有线程在占用系统资源,所以找出哪个进程cpu高(top命令)该进程中的哪个线程cpu高(top -Hp)如果是java程序,导出该线程的堆栈 (jstack命令)查找哪个方法(栈帧)消耗时间,哪个方法调用的哪个方法 (jstack),然后去看这个方法的代码工作线程占比高 / 垃圾回收线程占比高?案例2:系统内存飙高,如何查找问题?导出堆内存 (jmap)分析 (jhat jvisualvm mat jpro原创 2020-06-29 21:01:42 · 69200 阅读 · 1 评论 -
JVM从入门到精通(七):GC常用参数,Method Area,JVM调优案例分析
GC常用参数-Xmn -Xms -Xmx -Xss年轻代 最小堆 最大堆 栈空间-XX:+UseTLAB使用TLAB,默认打开-XX:+PrintTLAB打印TLAB的使用情况-XX:TLABSize设置TLAB大小-XX:+DisableExplictGCSystem.gc()不管用 ,FGC-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintHeapAtGC-XX:+PrintGCTimeStamps-XX:+PrintGCApplicati原创 2020-06-28 15:51:10 · 68907 阅读 · 0 评论 -
JVM从入门到精通(六):JVM调优必备理论知识 - 3种垃圾清除算法,常见的垃圾回收器
JVM调优是一层窗户纸,只是看起来很难。学完本节课,让你:熟悉 GC 常用算法,熟悉常见垃圾回收器,具有实际 JVM 调优实战经验What is garbage什么是垃圾?没有引用指向的对象就是垃圾。怎么找到垃圾?引用计数不能解决循环引用根可达算法JNI 是本地方法用到的对象《JVM虚拟机规范》对于根对象的定义,下图右侧:清除垃圾的算法标记清除算法 mark-sweep算法相对简单,存活对象比较多的情况下效率比较高。不适合伊甸区,伊甸区的存活对象比较少。两边扫描原创 2020-06-27 20:09:57 · 65317 阅读 · 0 评论 -
JVM从入门到精通(五): Java运行时数据区和常用指令
JVM Runtime Data Area and JVM InstructionsJava运行时数据区以及JVM指令i=i++结果为8i=++i结果为9一个class的生命周期以下面的规范为准:运行时数据区的构成PC:peogram counter 程序计数器DirectMemory:直接内存,JVM可以直接访问内核空间的内存(OS管理的内存),零拷贝(不需要拷贝),NIO用到了,提高效率MethodArea:方法区,里面有常量池PC 程序计数器JVM 栈空间在每一个线程创原创 2020-06-26 11:54:45 · 68313 阅读 · 2 评论 -
JVM从入门到精通(四):内存屏障与JVM指令,对象的内存布局
JMM硬件层数据一致性协议很多,intel 用MESIhttps://www.cnblogs.com/z00377750/p/9180644.html现代CPU的数据一致性实现 = 缓存锁(MESI …) + 总线锁读取缓存以cache line为基本单位,目前64bytes位于同一缓存行的两个不同数据,被两个不同CPU锁定,产生互相影响的伪共享问题伪共享问题:JUC/c_028_FalseSharing使用缓存行的对齐能够提高效率乱序问题CPU为了提高指令执行效率,会在一条指令执行过程原创 2020-06-25 11:54:13 · 65080 阅读 · 0 评论 -
JVM从入门到精通(三):热加载的实现原理,Java内存模型,缓存行,指令重排,合并写技术等
上节回顾:类加载机制双亲委派机制parent只是一个成员变量,不是继承关系。上节课的遗留问题parent是怎么指定的?手动指定parent:双亲委派机制可以被打破吗?双亲委派机制是在ClassLoader类里的LoadClass()方法已经写死的,你只需重写FingClass()方法就可以了。那怎么打破它呢?热加载的实现原理Tomcat把整个ClassLoader全部干掉,再用自己实现的ClassLoader把新修改过的类的Class重新Load一遍。正确版本:将一个class加原创 2020-06-24 11:34:38 · 67866 阅读 · 1 评论 -
JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行
复习:Class文件结构Class Loading Linking Initializing:编译 加载 初始化这节课,我们讲 class 是怎么从硬盘中加载到内存中,并且准备执行的。package com.mashibing.jvm.c2_classloader;public class T004_ParentAndChild { public static void main(String[] args) { System.out.println(T004_Par原创 2020-06-23 18:01:31 · 68082 阅读 · 0 评论 -
JVM从入门到精通(一):JVM入门级class文件格式
JVM 基础入门JVM第二章 Class File Format整个class文件的格式就是一个二进制字节流,这个二进制字节流是由Java虚拟机来解释的。如何看到十六进制的字节码?安装idea插件BinEd安装jclasslib插件,用来帮你分析整个class的内容ConstantPool常量池里面的常量类型特别多,总而言之,常量池是一个class里面最复杂的东西。在Java语言规范中,指明了:long和double的读写操作应该是原子的。...原创 2020-06-22 15:56:16 · 69265 阅读 · 2 评论