OOM

在博客中搜索相关文章

打牌记账-技术文档

本项目针对多人打牌记账难点,开发了基于 Spring Boot 的 Web 实时记账小程序,实现房间实时同步、最多 8 人协作、数据持久化和跨平台访问。技术选型包括 Spring Boot、MyBatis‑Plus、MySQL、WebSocket、Thymeleaf 等。系统采用三层架构,使用 UUID 生成 8 位房间码、乐观锁控制人数、BCrypt 加密密码,并提供房间、用户、记账等核心业务模块。

Elasticsearch7.x实战指南

Elasticsearch 7.x 通过废弃 TransportClient、统一使用 High‑level REST client、默认类型改为 _doc、分片数降至 1 等改动,提升了连接方式和资源占用。内部升级至 Lucene 8,加入 Weak‑AND、Intervals 查询以及更智能的集群协调与熔断机制,显著优化查询相关性和内存安全。本文系统演示了 ES7 的基本操作(索引、映射、文档的增删改查),以及高级特性包括地理坐标、动态映射、动态模板和 Query DSL 的全文、过滤与聚合用法,为 Java 开发者提供了从集群连接到复杂查询的完整实战指南。

Redis6标准配置文件

本文提供 Redis 6 标准配置文件示例,说明如何通过命令行加载配置、单位写法以及包含其它文件的用法。列出模块加载方式、网络参数(bind、protected‑mode、端口、tcp‑backlog、unix‑socket、连接超时、keepalive)及其安全警示。重点介绍 TLS/SSL 配置,包括启用 tls‑port、证书/私钥文件、客户端证书、DH 参数、CA 证书及客户端认证模式。整体展示各项可选指令的作用与最佳实践。

面试现场【JVM篇】

本文系统梳理了 JVM 面试常见要点,包括运行时内存结构(程序计数器、虚拟机栈、本地方法栈、堆、方法区、直接内存),垃圾回收原理(引用计数、根可达、GC Roots 分类),四种引用类型,分代收集假设与记忆集,标记‑清除、复制、整理三大算法及 STW、Safe‑point、OopMap 的作用。随后简介了 Serial、ParNew、Parallel Scavenge、Parallel Old、CMS、G1 等主流收集器的特点与适用场景,并简述对象栈上分配、内存布局、类加载双亲委派等概念,为面试提供完整参考。

SpringBoot接口加密解密工具

本文介绍了一个基于 SpringBoot、通过注解实现的接口加密解密工具。工具支持 Base64、DES、3DES、AES、RSA 等对称/非对称算法以及 MD5 加密,只需在接口上添加 @ZxfEncryptResponse 或 @ZxfDecryptRequest 并指定 AlgorithmType 即可完成响应加密或请求解密。使用步骤包括拉取代码、打包成 jar、在项目中引入依赖并在配置文件中配置相应的密钥(DES、3DES、AES、RSA 公私钥),提供了一套可直接使用的密钥示例以及示例代码。项目源码已开源于 Gitee。

深入解析CompletableFuture的设计哲学与实践

本文系统阐述了 Java 8 中 CompletableFuture 的设计哲学与实现细节。首先说明它受函数式编程和 Promise 思想驱动,提供链式、流式 API(thenApply、thenCompose 等)以实现回调与组合。随后解析内部状态机(INCOMPLETE、NORMAL、EXCEPTIONAL)和基于 Treiber 栈的依赖管理,揭示完成、异常传播的核心实现。接着通过电商订单处理案例演示并行检查、价格计算、库存扣减等业务的完整异步流水线,涵盖 thenCombine、allOf、异常处理、超时控制等实用技巧。最后列举条件执行、重试、超时降级等高级模式,展示 CompletableFuture 在高性能、可维护异步服务中的广泛应用。

JVM对象创建与内存分配机制

JVM在执行new指令时首先检查类是否已加载、解析、初始化,然后在堆中为对象分配内存,采用“指针碰撞”或“空闲列表”方式,并通过CAS或TLAB解决并发冲突。分配后进行零值填充,设置对象头(包含hash、年龄、锁状态、类指针等),最后执行构造函数完成属性赋值。对象大小受对象头、实例字段和8字节对齐填充影响,默认开启指针压缩(UseCompressedOops/UseCompressedClassPointers)以降低内存占用并支持最高32 GB堆。JVM通过逃逸分析和标量替换可将不逃逸对象分配到栈上,减轻GC压力。

JVM(一)

JVM由类加载器、运行时数据区、执行引擎和本地接口四部分构成。运行时数据区包括程序计数器、虚拟机栈(及本地方法栈)、堆、方法区和运行时常量池。JVM启动先装载JRE、装入JVM动态库、初始化并创建JNIEnv,随后加载并解释class或jar文件,执行引擎将字节码翻译为机器指令。程序计数器负责指令流控制,栈用于方法调用和本地方法。内存划分决定对象、类元数据及常量的存放位置,内存不足时抛出相应异常。类加载经历加载、验证、准备、解析、初始化等阶段。

一次OOM排查实录

日志在运行时被硬截断,排查后发现是 Linux OOM Killer 将进程强制 kill,根因是 2 GB 服务器同时运行 3 个未限制堆大小的 Spring Boot 项目、MySQL 8.0 和监控组件,JVM 默认占用近 3 GB,MySQL 参数又消耗数百 MB,且没有 Swap 作为缓冲。通过为每个 JVM 设置‑Xms/‑Xmx(如 512 M、256 M),调小 MySQL 的 innodb_buffer_pool、max_connections、关闭 performance_schema 并添加 2 GB swap,内存使用降至安全范围,进程不再被 OOM Killer 杀死。经验教训是:小内存机器必须限制 JVM、精简 MySQL 配置并配置 swap,长期方案是迁移数据库或升级机器。

实现响应式图片查看器:轻量级lightbox解决方案

本文详述如何使用原生 HTML、CSS 与 JavaScript 构建一个轻量级、响应式的 Lightbox 组件。首先定义包含图片和放大/缩小按钮的 HTML 结构,并通过 CSS 实现全屏居中、半透明背景及圆形按钮的视觉效果。随后编写 JavaScript,实现点击任意图片弹出 Lightbox、滚轮或按钮控制缩放、拖拽移动、双指捏合手势的触摸缩放,以及点击背景或图片恢复默认状态以关闭弹窗。整个方案无需外部库,兼容桌面和移动端,提供平滑动画和良好交互体验。

Redis实战常见问题与解决方案

Redis在Java项目中常见的穿透、击穿、雪崩等缓存问题,可通过布隆过滤、互斥锁或逻辑过期、随机TTL等手段防御;为保证缓存与库的一致性,采用延迟双删或基于消息队列的最终一致方案;大key导致内存压力时,可拆分分片或使用合适的数据结构;通过配置allkeys‑lru、合理的maxmemory‑policy 以及 Jedis 连接池的 maxTotal、maxIdle、testOnBorrow 等参数,提升内存管理和连接稳定性。整体提供了代码示例和实践要点,帮助开发者在实际使用 Redis 时避免性能瓶颈和数据错误。

JVM(二)

本文介绍JVM垃圾回收的触发时机及降低Full GC次数的措施,阐述对象可回收性的判定方式(GC Roots + 可达性),以及对象在新生代通过年龄计数晋升老年代的机制。解释新生代Eden 与两块Survivor的划分比例和双Survivor 防止碎片的作用。系统比较标记‑清除、标记‑复制、标记‑整理三大算法,重点说明G1 基于Region的局部回收策略和CMS 的并发标记‑清除流程。最后区分内存泄漏与内存溢出并给出相应的防治建议。