Jvm
文章平均质量分 84
jvm
猎户星座。
花有重开日,人无再少年。
展开
-
JVM常用参数
要设置好各种 JVM 参数,还可以对 server 进行压测, 预估自己的业务量,设定好一些 JVM 参数进行压测看下这些设置好的 JVM 参数是否能满足要求。经过前面对 JVM 参数的介绍及相关例子的实验,相信大家对 JVM 的参数有了比较深刻的理解,接下来我们再谈谈如何设置 JVM 参数。输出详细的 GC 收集日志信息。测试时候,可以将参数调到最小,定义一个大对象,撑爆堆内存,参数不懂,推荐直接去看官网。转载 2024-02-28 11:26:02 · 58 阅读 · 0 评论 -
处理Full GC
转载 2024-02-28 11:16:52 · 53 阅读 · 0 评论 -
Minor GC、Major GC和Full GC
Full GC(Full Garbage Collection)是Java虚拟机中进行垃圾回收的一种操作,它的目标是清理整个Java堆内存,包括年轻代(Young Generation)、年老代(Old Generation或Tenured Generation)、以及永久代(在Java 8及之前的版本中,而在Java 8及之后的版本中由Metaspace取代,所以这里可以理解为元空间Metaspace)。转载 2024-02-28 10:21:48 · 822 阅读 · 0 评论 -
JVM性能调优详解
则其他堆空间的分配,基于以下规则来进行。一般是从满足程序的内存使用需求开始的,之后是时间延迟的要求,最后才是吞吐量的要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。评估当前吞吐量和目标差距是否巨大,如果在20%左右,可以修改参数,加大内存,再次从头调试,如果巨大就需要从整个应用层面来考虑,设计以及目标是否一致了,重新评估吞吐目标。通过以上原则,我们发现,其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”。转载 2024-02-27 10:38:56 · 75 阅读 · 0 评论 -
JVM三色标记算法
三色标记法,主要是为了高效的标记可被回收的内存块。白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代 表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无须重新扫描一遍。黑色对 象不可能直接(不经过灰色对象)指向某个白色对象。灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过。转载 2024-02-25 13:35:09 · 252 阅读 · 0 评论 -
CPU指令乱序执行
说了这么多,很可能在我之后的文章中被一句话带过。其实我想表达的思想就是,实际代码运行的顺序可能和我们代码编写的顺序并不一致。记住这句话很容易,但或许总会有人像我一样想稍微深入一点来了解这句话的本质吧。除了本文所述,CPU和高速缓存之间的交互过程中,硬件工程师也着实给软件开发者挖了不少坑,内存屏障就是在这种背景下产生的。转载 2024-02-24 21:50:00 · 93 阅读 · 0 评论 -
CPU缓存一致性协议原理
一个long类型的x是8个字节,这2个x位于同一个缓存行的概率极大(尤其这2个x位于同一个数组,在内存中是挨着的),2个cpu分别修改一个x,2个x在一方cpu都有缓存,修改了其中一个需要通知另外一个,每改一次通知一下,总之在修改的时候需要触发一种机制需要另外的cpu跟我保持一致,如果这样的话,耗时当然会比较长。当要访问一个数据的时候,干脆每一次缓存一小块的数据,这一小块数据里面包含了整个数组的数据,当访问数组中的任意元素数据的时候,就可以直接从缓存中读取到了,这一块的数据被称为缓存行。转载 2024-02-24 21:49:03 · 60 阅读 · 0 评论 -
JVM级别内存屏障如何禁止指令重排序
为什么有一个空指令存在,因lock指令在锁总线的时候,这条指令后面必须跟一条指令,后面指令不能为空,所以后面得跟一条指令,但是后面跟的又不能有任何作用,如果有任何作用,中间改了别的值,也不对,所以设计了这么一个指令,往某个寄存器上加了个0,跟没有操作一样,主要为了迎合lock指令的参数要求即后面必须跟一个指令,其实只要有一个lock指令就足够了。java写的volatile,jvm编译执行,java是解释执行的,所以要想了解volatile怎么实现的,得去读hotspot解释器的代码,看是怎么解释完成的?转载 2024-02-24 21:47:55 · 68 阅读 · 0 评论 -
Tomcat之类加载器
在学习Tomcat中的类加载器,并且Tomcat为什么要实现自己的类加载器打破双亲委派模型原因之前,我们首先需要知道Java中定义的类加载器是什么,双亲委派模型是什么。Java中的类加载器类加载器负责在程序运行时将java文件动态加载到JVM中从Java虚拟机的角度来讲的话,存在两种不同的类加载器: 启动类加载器(Bootstrap ClassLoader):这个类加载器是使用C++语言实现的,是虚拟机自身的一部分。 其他的类加载器:这些类加载器都由Java语言实现,独立于虚转载 2021-02-25 16:34:27 · 116 阅读 · 0 评论 -
JVM之对象引用
对于Java中的垃圾回收机制来说,对象是否被回收的标准在于该对象是否被引用。因此,引用也是JVM进行内存管理的一个重要概念。众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样担心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等方法。在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这就像在日常生活中,从商店购买了某样物品后,如果有用,转载 2020-12-11 13:51:40 · 228 阅读 · 0 评论 -
JVM之Arthas
大纲目录本文字较多,可以根据目录进行对应的阅读。 背景:现在的问题所在? Arthas: Arthas能帮助你干什么?各种命令原理是什么? 常见的一些问题? 1.背景2018年已过,但是在过去的一年里面开源了很多优秀的项目,这里我要介绍两个比较相似的阿里开源项目一个是Arthas,另一个是jvm-sandbox。这两个项目都是在今年开源的,为什么要介绍这两个项目呢?这里先卖个关子,先问下大家不知道是否遇到过下面的场景呢? 当你线上项目出了问题,但是一打开日志发现,转载 2020-12-06 15:22:55 · 119 阅读 · 0 评论 -
JVM之类加载流程
前言本文将由浅及深,介绍Java类加载的过程和原理,进一步对类加载器的进行源码分析,完成一个自定义的类加载器。正文(一). 类加载器是什么类加载器简言之,就是用于把.class文件中的字节码信息转化为具体的java.lang.Class对象的过程的工具。具体过程:在实际类加载过程中,JVM会将所有的.class字节码文件中的二进制数据读入内存中,导入运行时数...转载 2020-03-20 21:21:12 · 339 阅读 · 0 评论 -
JVM之内存结构
前言JVM内存区域包括PC计数器、Java虚拟机栈、本地方法栈、堆、方法区、运行时常量池和直接内存。本文主要介绍各个内存区域的作用和特性,同时分别阐述各个区域发生内存溢出的可能性和异常类型。正文(一). JVM内存区域Java虚拟机执行Java程序的过程中,会把所管理的内存划分为若干不同的数据区域。这些内存区域各有各的用途,以及创建和销毁时间。有的区域随着虚拟机进程的启动而存在...转载 2020-03-20 20:04:48 · 197 阅读 · 0 评论 -
JVM之监控和故障处理命令
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命...转载 2019-01-19 10:13:20 · 237 阅读 · 0 评论