![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 89
11来了
目前在读研究生研二,会持续分享后端系列完整内容以及面试分析!
展开
-
面试官:聊聊 G1,你清楚 G1 的特性吗?
天生适合于大内存机器!为什么这么说,就是因为 G1 是可以控制 GC 停顿时间的,那么比如说对于 Kafka 类似的高并发消息中间件,一般来说都需要大内存机器部署,比如 64G,那么可以给年轻代 30G 内存来存放对象原创 2024-02-17 23:14:28 · 1179 阅读 · 0 评论 -
JVM虚拟机系统性学习-JVM调优实战之内存溢出、高并发场景调优
对于年轻代的设置,我们可以考虑在堆空间大小不变的情况下,将新生代空间扩展为 0.5 ~ 1 倍,可以分别扩展 0.5 倍、1 倍,再对扩展后的应用进行压测分析,来选择表现性能更好的方案,这里我们就将年轻代扩展 0.5 倍。对于 JDK8 来说,如果不指定元空间的大小,在 64 位操作系统中,默认元空间初始值为 21MB,默认元空间的最大值是系统内存的大小,初始未给定的元空间的大小,因此元空间初始为 21MB,导致。的,适合于后台任务型服务器,但是当前服务是与用户进行交互的,因此需要使用。原创 2023-12-15 20:43:27 · 976 阅读 · 0 评论 -
JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优
首先是 JVM 内存大小,可以看到新生代分配了 624 mb,而 Peak 也就是峰值也达到了 624 mb,说明新生代很容易就被占满了,而对于元空间 Meta Space 来说,分配了 1 个 gb,而峰值才使用了 59 mb,因此元空间分配的大小也不合理,对于 JDK8 来说,如果不指定元空间的大小,默认元空间的最大值是系统内存的大小,在 64 位操作系统中,元空间默认初始值为 21MB,如果初始未给定的元空间的大小,导致初始元空间过小,会。在分析 GC 日志时,可以同时采用多种工具。原创 2023-12-14 11:59:39 · 1131 阅读 · 0 评论 -
JVM虚拟机系统性学习-JVM调优之GC日志分析
大多数情况下是不需要进行 JVM 调优的,JVM 调优是不得已的手段,如果要对系统进行优化,则优先对系统架构和代码进行优化!JVM 调优的目的就是为了让应用程序使用最小的硬件消耗来承载更大的吞吐量。首先,为什么要 JVM 调优呢?原创 2023-12-14 10:58:25 · 359 阅读 · 0 评论 -
JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack
jhat 命令会解析 Java 堆转储文件,并且启动一个 web server,再用浏览器就可以查看 dump 出来的 heap 二进制文件。用于生成 Java 虚拟机当前时刻的线程快照,生成线程快照的主要目的是定位线程出现长时间停顿的原因。查看 Java 程序运行时相关信息,可以查看运行时堆的相关情况。命令,就可以启动一个 web server,用浏览器访问即可。查看堆内存使用情况,一般结合 jhat 使用。查看正在运行的 Java 程序的扩展参数。可以在 jvm 运行时获取 dump。原创 2023-12-14 10:48:24 · 949 阅读 · 0 评论 -
JVM虚拟机系统性学习-垃圾回收器CMS、G1和ZGC
并且在 CMS 回收过程中,需要确保用户线程有足够的内存可以使用,因此在堆内存使用率达到某一阈值,就需要开始内存回收,如果 CMS 运行期间预留的内存不够用户线程使用的话,会临时启动 Serial Old 收集器来回收老年代。是在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小都可以把垃圾收集的停顿时间限制在 10 ms 以内(在 JDK16 之前是 10 ms,在 JDK16 之后目标是 1 ms 的低延迟)的低延迟。技术解决了对象转移过程中准确访问对象的问题,实现了垃圾回收过程中对象的并发转移。原创 2023-12-13 13:06:16 · 1439 阅读 · 0 评论 -
JVM虚拟机系统性学习-垃圾回收器Serial、ParNew、Parallel Scavenge和Parallel Old
ParNew + SerialOld 配合使用,ParNew 回收新生代,并行更高效,老年代回收次数少,使用串行更节省资源。除了年轻代之外,Serial 收集器还提供了用于执行老年代垃圾收集的 Serial Old 收集器。Serial是最基本、最古老的垃圾收集器。原创 2023-12-13 13:03:53 · 583 阅读 · 0 评论 -
JVM虚拟机系统性学习-对象存活判断算法、对象引用类型和垃圾清除算法
每次分配内存时只使用 Eden 和其中的一块 Survivor 区,在进行垃圾回收时,将 Eden 和已经使用过的 Survivor 区的存活对象转移到另一块 Survivor 区中,再清理 Eden 和已经使用过的 Survivor 区域,当 Survivor 区域的空间不足以容纳一次 Minor GC 之后存活的对象时,就需要依赖老年代进行分配担保(通过分配担保机制,将存活的对象放入老年代即可),通过可达性分析算法分析后,内存中的存活对象都会被根对象集合直接或间接连接着,搜索过程所走过的路径称为。原创 2023-12-12 09:44:45 · 1235 阅读 · 0 评论 -
JVM虚拟机系统性学习-对象的创建流程及对象的访问定位
控制台打印如下,对象头占 12B(MarkWord 8B + KlassPoint 4B),有 4B 的对齐填充,实例数据 0B,因此整个对象大小为 16B。空间担保指的是在 MinorGC 前,会判断老年代可用内存是否大于新生代全部对象大小,如果大于,则此次 Minor GC 是安全的。在幸存对象每次转移的时候,对会将对象的生存年龄 + 1,达到 15 时会放入老年代中。,如果大于,则尝试 Minor GC;后发现,一个对象并没有逃逸出方法的话,就可能被优化为在。,这是常见的堆外存储技术。原创 2023-12-12 09:35:29 · 1013 阅读 · 0 评论 -
JVM虚拟机系统性学习-运行时数据区(方法区、程序计数器、直接内存)
在 JVM 堆内存中有 GC 机制,GC 后可能会导致堆内存中数据位置发生变化,那么如果直接将 JVM 堆内存中的数据写入 Socket 缓冲区中,如果写入过程中发生 GC,导致我们需要写入的数据位置发生变化,就会将错误的数据写入 Socket 缓冲区。的情况,我们在网络发送数据需要将数据先写入 Socket 的缓冲区内,那么如果数据存储在 JVM 的堆内存中的话,会先将堆内存中的数据复制一份到直接内存中,再将直接内存中的数据写入到 Socket 缓冲区中,之后进行数据的发送。原创 2023-12-11 14:35:55 · 952 阅读 · 0 评论 -
JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)
如果当前帧(虚拟机栈最上方的帧,即当前执行方法的栈帧)是由构造方法或者实例方法所产生的,那么该对象的 this 引用会被放在局部变量表中 index 为 0 的地方,因此在示例方法和构造方法中可以使用 this 关键字,而在静态方法的局部变量表中没有存储 this 的引用,因此无法使用 this 关键字。中该栈所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接,在 Java 源代码被编译为字节码文件时,所有变量和方法都为符号引用保存在 class 文件的常量池,原创 2023-12-11 14:23:40 · 1104 阅读 · 0 评论 -
JVM虚拟机系统性学习-运行时数据区(堆)
Java 堆在 JVM 启动时创建内存区域去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域。在幸存对象每次转移的时候,对会将对象的生存年龄 + 1,达到 15 时会放入老年代中。JVM 由三部分组成:类加载系统、运行时数据区、执行引擎。后发现,一个对象并没有逃逸出方法的话,就可能被优化为在。在 JDK1.8 中,堆由两部分组成:新生代和老年代。下边讲一下运行时数据区中的构成。,这是常见的堆外存储技术。原创 2023-12-10 22:28:51 · 518 阅读 · 0 评论 -
JVM虚拟机系统性学习-类加载子系统
是 Javac 编译器自动生成的,该方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并生成的,如果一个类中没有静态代码块, 也没有变量赋值的动作,那么编译器可以不为这个类生成。这里不包含用 final 修饰的 static 变量,因为 final 修饰的变量在编译为 class 字节码文件的时候就会分配了,准备阶段会显式初始化。验证:目的在于确保 class 文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性。加载类的class文件时,Java虚拟机采用的是。原创 2023-12-10 22:27:07 · 938 阅读 · 0 评论