首页
学习
活动
专区
工具
TVP
发布

干货满满张哈希

专栏作者
477
文章
332454
阅读量
49
订阅数
全网最硬核 JVM 内存解析 - 12.元空间各种监控手段
通过 jcmd <pid> VM.metaspace 命令可以查看对应 JVM 进程的元空间当前的详细使用情况,返回内容是:
干货满满张哈希
2023-05-01
6080
全网最硬核 JVM 内存解析 - 1.从 Native Memory Tracking 说起
JVM 内存究竟包括哪些,可能网上众说纷纭。我们这里由官方提供的一个查看 JVM 内存占用的工具引入,即 Native Memory Tracking。不过要注意的一点是,这个只能监控 JVM 原生申请的内存大小,如果是通过 JDK 封装的系统 API 申请的内存,是统计不到的,例如 Java JDK 中的 DirectBuffer 以及 MappedByteBuffer 这两个(当然,对于这两个,我们后面也有其他的办法去看到当前使用的大小。当然xigao dog 啥都不会)。以及如果你自己封装 JNI 调用系统调用去申请内存,都是 Native Memory Tracking 无法涵盖的。这点要注意。
干货满满张哈希
2023-05-01
9700
全网最硬核 JVM 内存解析 - 13.JVM 线程内存设计
Java 19 中 Loom 终于 Preview 了,虚拟线程(VirtualThread)是我期待已久的特性,但是这里我们说的线程内存,并不是这种 虚拟线程,还是老的线程。其实新的虚拟线程,在线程内存结构上并没有啥变化,只是存储位置的变化,实际的负载线程(CarrierThread)还是老的线程。
干货满满张哈希
2023-05-01
3820
全网最硬核 JVM 内存解析 - 11.元空间分配与回收流程举例
前文我们没有提到,如何限制元空间的大小,其实就是限制 commit 的内存大小。元空间的限制不只是受限于我们的参数配置,并且前面我们提到了,元空间的内存回收也比较特殊,元空间的内存基本都是每个类加载器的 ClassLoaderData 申请并管理的,在类加载器被 GC 回收后,ClassLoaderData 管理的这些元空间也会被回收掉。所以,GC 是可能触发一部分元空间被回收了。所以元空间在设计的时候,还有一个动态限制 _capacity_until_GC,即触发 GC 的元空间占用大小。当要分配的空间导致元空间整体占用超过这个限制的时候,尝试触发 GC。这个动态限制也会在每次 GC 的时候动态扩大或者缩小。动态扩大以及缩小
干货满满张哈希
2023-05-01
4700
全网最硬核 JVM 内存解析 - 10.元空间分配与回收流程举例
我们前面介绍了元空间的组成元素,但是没有将他们完整的串联起来,我们这里举一个简单的例子,将之前的所有元素串联起来。
干货满满张哈希
2023-05-01
2540
全网最硬核 JVM 内存解析 - 9.元空间内存分配流程
我们过一下元空间内存分配流程,我们会忽略一些 GC 相关的还有并发安全的细节,否则涉及的概念太多,一下说不过来,这些细节,会在以后的系列中详细提到。
干货满满张哈希
2023-05-01
3390
全网最硬核 JVM 内存解析 - 8.元空间的核心概念与设计
从 Java 16 开始,引入了弹性元空间。老的元空间由于设计上分配粒度比较大,并且没有很好地释放空间的策略设计,所以占用可能比较大。Java 16 开始,JEP 387: Elastic Metaspace 引入了弹性元空间的设计,也是我们这里要讨论的设计。这个弹性元空间也引入了一个重要的参数 -XX:MetaspaceReclaimPolicy。
干货满满张哈希
2023-05-01
5170
全网最硬核 JVM 内存解析 - 7.元空间存储的元数据
JVM 在执行 Java 应用程序时,将加载的 Java 类的许多细节记录在内存中,这些信息称为类元数据(Class MetaData)。这些元数据对于 Java 的很多灵活的语言以及虚拟机特性都是很重要的,比如动态类加载、JIT 实时编译、反射以及动态代理等等。不同的 JVM 加载类保存的内存信息是不一样的,它们通常在更低的内存占用与更快的执行速度之间进行权衡(类似于空间还是时间的权衡)。对于 OpenJDK Hotspot 使用的则是相对丰富的元数据模型来获得尽可能快的性能(时间优先,不影响速度的情况下尽量优化空间占用)。相比于 C,C++,Go 这些离线编译为可执行二进制文件的程序相比,像 JVM 这样的托管运行时动态解释执行或者编译执行的,则需要保留更多关于正在执行的代码的运行时信息。原因如下:
干货满满张哈希
2023-05-01
5960
全网最硬核 JVM 内存解析 - 6.其他 Java 堆内存相关的特殊机制
不同的 GC 堆大小动态伸缩有很大很大的差异(比如 ParallelGC 涉及 UseAdaptiveSizePolicy 启用的动态堆大小策略以及相关的 UsePSAdaptiveSurvivorSizePolicy、UseAdaptiveGenerationSizePolicyAtMinorCollection 等等等等的参数参与决定计算最新堆大小的方式以及时机),在这个系列以后的章节我们详细分析每个 GC 的时候再详细分析这些不同 GC 的动态伸缩策略。我们这里仅涉及大多数 GC 通用的堆大小伸缩涉及的参数:MinHeapFreeRatio 与 MaxHeapFreeRatio:
干货满满张哈希
2023-05-01
4890
全网最硬核 JVM 内存解析 - 5.压缩对象指针相关机制
现代机器大部分是 64 位的,JVM 也从 9 开始仅提供 64 位的虚拟机。在 JVM 中,一个对象指针,对应进程存储这个对象的虚拟内存的起始位置,也是 64 位大小:
干货满满张哈希
2023-05-01
2640
全网最硬核 JVM 内存解析 - 4.Java 堆内存大小的确认
不同的 GC 情况下,初始化以及扩展的流程可能在某些细节不太一样,但是,大体的思路都是:
干货满满张哈希
2023-05-01
7850
全网最硬核 JVM 内存解析 - 3.大页分配 UseLargePages
前面提到了虚拟内存需要映射物理内存才能使用,这个映射关系被保存在内存中的页表(Page Table)。现代 CPU 架构中一般有 TLB (Translation Lookaside Buffer,翻译后备缓冲,也称为页表寄存器缓冲)存在,在里面保存了经常使用的页表映射项。TLB 的大小有限,一般 TLB 如果只能容纳小于 100 个页表映射项。 我们能让程序的虚拟内存对应的页表映射项都处于 TLB 中,那么能大大提升程序性能,这就要尽量减少页表映射项的个数:页表项个数 = 程序所需内存大小 / 页大小。我们要么缩小程序所需内存,要么增大页大小。我们一般会考虑增加页大小,这就大页分配的由来,JVM 对于堆内存分配也支持大页分配,用于优化大堆内存的分配。那么 Linux 环境中有哪些大页分配的方式呢?
干货满满张哈希
2023-05-01
6670
全网最硬核 JVM 内存解析 - 2.JVM 内存申请与使用流程
Linux 内存管理模型不是咱们这个系列的讨论重点,我们这里只会简单提一些对于咱们这个系列需要了解到的,如果读者想要深入理解,建议大家查看 bin 神(公众号:bin 的技术小屋)的系列文章:一步一图带你深入理解 Linux 虚拟内存管理
干货满满张哈希
2023-05-01
5950
我所使用的生产 Java 17 启动参数
目前正常微服务综合内存占用+延迟+吞吐量,还是 G1 更优秀。但是如果你的微服务本身压力没到机器极限,要求延迟低,那么 ZGC 最好。如果你是实现数据库那样的需求(大量缓存对象,即长时间生存对象,老年代很大,并且还会可能分配大于区域的对象),那么必须使用 ZGC。
干货满满张哈希
2022-06-15
2.4K0
CMU 15-445 数据库课程第五课文字版 - 缓冲池
今天的课程是关于期待已久的缓冲池的话题,其实就是 DBMS 如何管理它的内存并从磁盘来回移动数据,我们希望DBMS自己来管理这些内存与磁盘存储交换的操作,而不是把它留给操作系统。你可以从两个方面考虑数据库存储和内存管理问题:
干货满满张哈希
2022-06-12
4150
CS162操作系统课程第二课-4个核心OS概念
我们讨论了操作系统如何扮演裁判,魔术师和粘合剂的角色,裁判是指对于资源保护的管理;魔术师是指我们要让它看起来像我们有一套非常干净易用的资源的抽象,而不是使用实际的没有统一接口的物理资源。粘合剂是一组通用服务,它们使在操作系统上编写程序变得更容易,例如文件系统服务、网络服务等等。
干货满满张哈希
2022-06-05
4180
Berkley CS162 操作系统第一课文字版-课程介绍
第一节课主要是关于课程介绍以及操作系统是什么、为什么这么重要的简介。现代最伟大的发明之一是互联网,它把全世界不同规模的设备都通过统一的网络连接在了一起:
干货满满张哈希
2022-05-29
2640
CMU 15-445 数据库课程第四课文字版 - 存储2
在这里,页中不存储元组数据,只会存储日志记录,即通过日志记录我们插入的数据以及我们如何更新系统中的数据,包括:插入元组的语句日志,删除元组的语句日志,更新元组的语句日志。 这种设计写得很快,因为不用在一个页里寻找并更新单个元组,就是在末尾追加写,这样写起来非常快,对于磁盘 I/O 也很好。
干货满满张哈希
2022-05-29
7090
CMU 15-445 数据库课程第三课文字版 - 存储1
这门课主要是关于如何开发一个功能全面的数据库管理系统,而不是如何编写复杂的 SQL 查询以及设计出最合理的关系模型数据库表。这门课会告诉你从低往上设计一个数据库管理系统需要的这些技术栈层:
干货满满张哈希
2022-05-18
4960
为什么我建议需要定期重建数据量大但是性能关键的表
一般现在对于业务要查询的数据量以及要保持的并发量高于一定配置的单实例 MySQL 的极限的情况,都会采取分库分表的方案解决。当然,现在也有很多 new SQL 的分布式数据库的解决方案,如果你用的是 MySQL,那么你可以考虑 TiDB(实现了 MySQL 协议,兼容 MySQL 客户端以及 SQL 语句)。如果你用的是的 PgSQL,那么你可以考虑使用 YugaByteDB(实现了 PgSQL 协议,兼容 PgSQL 客户端以及 SQL 语句),他们目前都有自己的云部署解决方案,你可以试试:
干货满满张哈希
2022-05-11
7670
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档