JVM-垃圾回收
文章平均质量分 90
无心六神通
金融科技系统架构师
展开
-
JVM-规范-8-常量池
运行时常量池是中的每个类或接口。它包含多种常量,从已知的到必须在的。运行时常量池的功能类似于传统编程语言的,尽管它包含的数据范围比典型的符号表更广。。在Java虚拟机。原创 2024-02-13 18:01:03 · 897 阅读 · 0 评论 -
Java-并发编程-常见面试题-总结
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。悲观锁通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。原创 2024-01-30 11:09:28 · 1105 阅读 · 0 评论 -
JVM-监控-故障处理-工具-总结
VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随 JDK 发布的功能最强大的运行监视和故障处理程序,官方在 VisualVM 的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析(Profiling)。生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。:输出对应名称的参数的具体值。原创 2024-02-06 02:58:13 · 881 阅读 · 0 评论 -
JVM-类加载器-详解-重点
类加载器从 JDK 1.0 就出现了,最初只是为了满足 Java Applet(已经被淘汰) 的需要。后来,慢慢成为 Java 程序中的一个重要组成部分,赋予了 Java 类可以被动态加载到 JVM 中并执行的能力。根据官方 API 文档的介绍:翻译过来大概的意思是:类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的。原创 2024-02-06 02:56:20 · 864 阅读 · 0 评论 -
JVM-类加载过程-详解
说明:原创 2024-02-06 02:55:09 · 998 阅读 · 0 评论 -
JVM-类文件结构-详解
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。Clojure(Lisp 语言的一种方言)、Groovy、Scala 等语言都是运行在 Java 虚拟机之上。原创 2024-02-06 02:54:14 · 746 阅读 · 0 评论 -
JVM-垃圾回收-详解-重点
当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存活都与“引用”有关。JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。原创 2024-02-06 02:52:58 · 739 阅读 · 0 评论 -
JVM-内存区域详解-重点
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。原创 2024-02-06 02:49:38 · 849 阅读 · 0 评论 -
JVM-大白话
如果在文中用词或者理解方面出现问题,欢迎指出。此文旨在提及而不深究,但会尽量效率地把知识点都抛出来JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···好,其实抛开这么专业的句子不说,就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作。原创 2024-02-06 02:46:59 · 1128 阅读 · 0 评论 -
JVM-最重要的参数总结
在本篇文章中,你将掌握最常用的 JVM 参数配置。原创 2024-02-06 02:43:22 · 904 阅读 · 0 评论 -
JVM-垃圾回收-CMS-GC问题-分析-解决-美团技术团队
本文主要针对 Hotspot VM 中“CMS + ParNew”组合的一些使用场景进行总结。重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省略较多,另外本文专业术语较多,有一定的阅读门槛,如未介绍清楚,还请自行查阅相关材料。| 总字数 2 万左右(不包含代码片段),整体阅读时间约 30min ,文章较长,可以选择你感兴趣的场景进行研究。在这里,我们把整个文章内容总结一下,方便大家整体地理解回顾。原创 2024-01-19 20:45:01 · 894 阅读 · 0 评论 -
JVM-垃圾回收-CMS调优-实际案例-美团技术团队
结合上述GC优化案例做个总结:1. 首先再次声明,在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间。我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化令其性能达到一个质的飞跃。2. 其次,通过上述分析,可以看出虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反。3. 最后,GC优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。GC优化必须建立在我们深入理解各种垃圾回收器的基础上,才能有事半功倍的效果。原创 2024-01-14 22:16:41 · 911 阅读 · 0 评论 -
JVM-常用参数-调优
持久代一般固定大小为64 MB,所以增大年轻代后,将会减小年老代大小。如果将此值设置为较大值,那么年轻代对象会在Survivor区进行多次复制,增加了对象在年轻代的存活时间,增加在年轻代即被回收的概率。,那么两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6。如果设置为0,那么年轻代对象不经过Survivor区,直接进入年老代。如果设置为4,那么年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。,设置每个线程的栈大小为128 KB。原创 2024-01-14 20:05:47 · 863 阅读 · 0 评论 -
JVM-参数-总结
将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度。比如下面的参数就是设置老年代与新生代内存的比值为 1。生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印 GC 日志的参数,便于分析 GC 相关的问题。Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。原创 2024-01-14 15:17:47 · 883 阅读 · 0 评论 -
JVM-内存结构
Java 虚拟机栈会为每一个即将运行的Java 方法创建一块叫做“栈帧局部变量表操作数栈动态链接方法出口信息......本地方法栈是为 JVM 运行Native 方法准备的空间,由于很多 Native 方法都是用 C 语言实现的,所以它通常又叫C 栈。它与 Java 虚拟机栈实现的功能类似,只不过本地方法栈是描述本地方法运行过程的内存模型。堆是用来存放对象的内存空间,几乎所有的对象都存储在堆中。Java虚拟机规范中定义方法区是堆的一个逻辑部分。已经被虚拟机加载的类信息常量静态变量。原创 2024-01-14 13:28:29 · 783 阅读 · 0 评论 -
JVM-垃圾回收器-线程
是不是也是通过栈?理论上是可行的,实际上JVM并没有区分Java栈和本地方法栈,如果通过栈进行处理则必须要区分这两种情况。JVM设计了另一个概念,原创 2023-12-23 20:25:34 · 899 阅读 · 0 评论 -
JVM-垃圾回收器-内存分配和管理
答:glibc里面的malloc也是通过mmap等系统调用来完成内存的分配,之后glibc再对已经分配到的内存进行管理。GC算法实现了一套自己的管理方式,所以再基于malloc/free实现效率肯定不高。问:众所周知glibc提供了我们常用的内存管理函数如malloc/free/realloc/memcopy/memset等。为什么JVM不直接使用这些函数?原创 2023-12-03 20:19:30 · 45 阅读 · 0 评论 -
JVM-垃圾回收器-对象头
但是我们要思考这样一个问题,当有多个引用对象的字段指向同一个被引用对象时,我们完成一个被引用对象的复制之后,其他引用对象还没有被遍历(即还指向被引用对象老的地址),如何处理这种情况?理论上根据额外的数据结构已经不需要再次判断,但是在垃圾回收的时候,通常是对整个区域的一块内存进行完全遍历,在对象分配时都是连续分配,当堆的尾部有尚未分配对象的时候,比如在新生代一个字通常初始化为0x20202020,需要对这些空白地址进行转换以判断是否为OOP,是否需要垃圾回收。,前面的30位指针是非常有用的。原创 2023-12-03 19:34:49 · 57 阅读 · 0 评论 -
JVM-垃圾回收器-卡表和位图
再结合堆分区对象的大小信息就能准确找出。其最主要的目的是为了效率,标记一个位和标记3个位相比能节约不少时间,如果对象很大,则更划算。,理论上它占用3个位来描述这个24字节已被使用了,实际上并不需要,即每一个位可以描述64位。原创 2023-12-02 18:56:31 · 150 阅读 · 0 评论 -
JVM-垃圾回收器-G1停顿预测模型
即α越小,最新的数据对结果影响越大,最近一次的数据对结果影响最大。这个add方法就是上面两个衰减公式的实现代码。G1的软实时停顿就是通过这样的预测模型来实现的。1-α为最近一次数据权值。dsd表示衰减标准偏差。原创 2023-12-02 17:30:33 · 236 阅读 · 0 评论 -
JVM-垃圾回收器-G1-分区
分区(Heap Region,HR)或称堆分区,是G1堆和操作系统交互的最小管理单位原创 2023-11-26 16:24:52 · 217 阅读 · 0 评论 -
JVM垃圾回收概述
(Garbage Collection,GC)指的是程序不用关心对象在内存中的生存周期,创建后只需要使用对象,不用关心何时释放以及如何释放对象,由JVM自动管理内存并释放这些对象所占用的空间。原创 2023-11-25 23:00:32 · 153 阅读 · 0 评论