自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 每天分享一个小知识——JVM之CMS的缺点

处理器资源敏感并发阶段占用CPU资源,默认线程数为(核心数+3)/4,核心数不足时(如4核以下)可能导致应用吞吐量显著下降,尤其在CPU密集型应用中更为明显。浮动垃圾与并发模式失败(Concurrent Mode Failure)并发清理阶段用户线程产生的新垃圾(浮动垃圾)无法被本次回收处理,可能占满老年代空间,触发Full GC(Serial Old),导致长时间STW停顿。内存碎片化使用标记-清除算法,长期运行后老年代内存碎片增多,大对象分配失败时会触发Full GC进行压缩,增加不可控停顿风险。

2025-05-06 11:54:13 469

原创 每天分享一个小知识——JVM之Parallel Old收集器

这个收集器是直到JDK 6时才开始提供的,在此之前,新生代的Parallel Scavenge收集器一直处于相 当尴尬的状态,原因是如果新生代选择了Parallel Scavenge收集器,老年代除了Serial Old(PS MarkSweep)收集器以外别无选择,其他表现良好的老年代收集器,如CMS无法与它配合工作。由于 老年代Serial Old收集器在服务端应用性能上的“拖累”,使用Parallel Scavenge收集器也未必能在整体上 获得吞吐量最大化的效果。

2025-04-30 11:41:24 269

原创 每天分享一个小知识——JVM之Parallel Scavenge收集器

而 ParNew 更适合“用户随时盯着,不能卡顿太久”的场景(比如在线商城)。:每次打扫只用5分钟,但每隔1小时打扫一次(适合不能接受长时间卡顿的实时服务)。如果你在写一个“不需要哄用户开心,只求赶紧干完活”的程序(比如半夜跑数据),:比如生成报表、跑数据分析,不怕卡顿,但要求任务总时间最短。默认是99,即回收时间不超过1%(1/(1+99))。,适合后台闷头干活的任务(比如数据分析、批量处理)。比如把新生代内存调小,回收更快,但回收次数变多。→ 数字越大,允许的回收时间越少,吞吐量越高。

2025-04-30 11:07:07 485

原创 每天分享一个小知识——JVM之ParNew收集器

回收时,把存活对象从活动区复制到闲置区,然后清空原活动区(就像把有用的文件整理到新文件夹,然后删掉旧文件夹的垃圾)。:ParNew 通常和 CMS(负责老年代回收)组队工作,一个管“年轻对象”,一个管“长寿对象”,适合对系统响应速度敏感的应用(比如网页服务)。它的核心任务就是快速回收那些“用完就丢”的临时对象,避免内存堆积。:虽然用多线程加速,但回收时仍需暂停所有用户线程(想象扫地时所有人暂停工作,但清洁工越多,暂停时间越短)。,用多线程缩短垃圾回收导致的系统卡顿,是多核时代的高效选择。

2025-04-30 10:52:24 479

原创 每天分享一个小知识——JVM之Serial 收集器

你在写作业,妈妈在收拾书桌。如果妈妈收拾的时候你还继续从书桌拿书、放书,桌子就永远收拾不干净。你的个人电脑跑一个小程序,Java 默认用 Serial 收集器,因为。(单线程),打扫时所有人必须停下手中的活(STW),但它的好处是。(单线程),干活时必须让所有人停下(STW),但它在。,短时间的 GC 暂停你根本感觉不到。,但它们的内存开销更大、实现更复杂。Serial(串行)收集器是。,让用户线程和 GC 线程。Serial 收集器就像。Serial 收集器就像。,因为有些场景它最适合。

2025-04-27 18:02:51 450

原创 每天分享一个小知识——JVM之三种垃圾回收算法

房间分成 8:1:1(比如 80% 放新东西,10% 做备用区),只浪费 10% 空间。:平时用标记-清除,碎片太多时才整理(类似平时乱放书,实在找不到空间再大扫除)。:清理后房间角落可能有零星小空间,虽然总量够,但放不下一个大沙发(大对象)。(对象长存):用标记-清除(减少移动开销)或标记-整理(解决碎片问题)。:老年代的东西长期存在(像经典书籍),移动次数少,整理一次管很久。:如果备用区不够,直接“贷款”把东西存到老年代(类似找担保人)。(对象短命):用复制算法(快速清理,容忍少量空间浪费)。

2025-04-27 10:53:32 494

原创 每天分享一个小知识———jvm之finalize自救

可以把 finalize() 比作“死刑犯的最后一次上诉机会”:如果能在“上诉”( finalize() )中证明自己“不该死”(重新建立引用),就能暂时存活;若对象在 finalize() 中成功“复活”(例如将 this 赋值给某个静态变量),则会被移出回收集合;第一次标记:当垃圾回收器通过可达性分析发现对象不可达时,会进行第一次标记,并检查是否需要执行 finalize() 方法。如果对象未覆盖 finalize() 方法,或该方法已被执行过,则直接判定为“无需执行”,对象会被回收。

2025-04-23 19:38:47 695

原创 每天分享一个小知识——JVM之强引用、软引用、弱引用、虚引用

最常见的引用类型,只要强引用存在,对象永远不会被回收。

2025-04-23 00:01:17 1849

原创 每天分享一个小知识———JVM之引用计数与可达性算法分析

场景引用计数(图书馆模型)可达性分析(社交网络模型)实时性立即下架归还的书定期批量清理僵尸账号循环引用处理❌ 互相引用的书无法下架✅ 孤立圈子直接清除性能代价管理员频繁更新计数器(琐碎操作)定期全面排查(短时集中资源)适用场景小规模、实时性要求高的系统(如嵌入式)大规模、健壮性优先的系统(如 Java)Java 的设计哲学牺牲实时性,换取健壮性:Java 面向企业级应用,内存泄漏的代价远高于短暂停顿。自动化内存管理:开发者无需手动处理对象生命周期,专注业务逻辑。高效处理复杂引用关系。

2025-04-22 00:37:56 1201

原创 每天分享一个小知识——JVM之直接内存溢出原理分析

直接内存溢出常见于高频I/O或框架隐式分配场景,特征为堆内存正常但进程总内存高。通过合理配置、监控工具及代码审查,可有效预防。例如,Netty应用中需结合业务负载调整内存参数,并及时清理无用的ByteBuffer💡 你的每个关注,都是我们共同进步的燃料!⬇️ 下期预告:《每天分享一个小知识——垃圾收集器与内存分配策略。

2025-04-21 00:50:21 690

原创 每天分享一个小知识——JVM之方法区和运行时常量池溢出

String str1 = new StringBuilder("计算机").append("软件").toString();监控元空间使用(如JConsole、VisualVM),警惕动态类生成框架(如Spring AOP、Groovy)。→ 按需租用的云存储(容量灵活,但需警惕无限扩张)。:字符串常量池在堆中,需限制堆大小才能触发OOM。方法区从永久代(堆内)演变为元空间(本地内存)。:移除永久代中的字符串常量池,将其移至堆内存。:同一类被不同类加载器加载,视为多个类。:永久代容量有限,直接OOM。

2025-04-20 11:50:26 1793

原创 每天分享一个小知识————JVM之虚拟机栈内存异常

32位系统进程内存上限约2GB,假设堆内存占1.5GB,剩余500MB只能创建约500个线程。每次递归调用都会压入一个栈帧,栈容量固定(比如默认1MB),最终栈被“塞满”,触发。:内存限制更大,但线程数仍受系统配置影响(如 Linux 默认线程数限制为几千)。// 无限递归,栈帧不断叠加。变量(占 800 字节),导致单个栈帧巨大,栈容量更快耗尽。:线程数严格受限于进程内存(约2GB),容易触发。:栈被“塞满”,问题在代码逻辑(递归、大栈帧)。:过小容易栈溢出,过大会减少可创建的线程数。

2025-04-20 11:04:26 1980

原创 每天分享一个小知识————JVM对象之对象的访问定位

某些高级垃圾回收器(如 Shenandoah)在移动对象时,会偷偷在旧地址留一个「转发指针」(类似纸条:“房间已搬到 250”),但这属于特殊优化。│ p → 200 │─────────→│ 对象头 (类型指针 → 300) │。│ 实例数据 (name等) │。:如果酒店调整房间(垃圾回收时移动对象),只需更新登记表里的门牌号,你的房卡(│ p → 100 │ │ 句柄池 (地址100) │。:存放所有房间的登记信息(对象的类型数据,比如房间类型、床型等)。

2025-04-18 23:59:19 759

原创 每天分享一个小知识————JVM对象之对象的内存布局

比如对象总大小是 18 字节,HotSpot 会偷偷加 6 字节的“空气砖”,凑成 24 字节(因为 24 是 8 的倍数)。如果是数组,对象头还要额外存数组长度(因为普通对象的大小可以通过类元数据推断,但数组长度不确定)。(默认开),子类的窄字段可能插到父类字段的“缝隙”里省空间(类似行李箱塞袜子)。(3字节):让总大小 12 + 9 + 3 = 24 字节(8 的倍数)。指向对象的“户口”(类元数据),告诉虚拟机这个对象是哪个类的实例。对齐填充(4字节):让对象头凑满 12 字节(假设需要对齐)

2025-04-18 22:51:58 680

原创 每天分享一个小知识————虚拟机对象之对象创建

先学图纸 → 腾地方 → 防抢材料 → 清空 → 贴标签 → 最后组装。这样你就能得到一个完整的 Java 对象啦!

2025-04-18 22:01:53 372

原创 每天分享一个小知识————JVM内存区域之直接内存

直接内存就是Java程序的"外部工作室",用好了效率飞起,但要注意别把工作室和家里面积加一起超了房东(操作系统)给的限额。

2025-04-18 10:15:59 313

原创 每天分享一个小知识————JVM内存区域之运行时常量池的一些概念

/ 字符串常量(final修饰)// 显式驻留到运行时常量池。// 基本类型final常量。// 字符串final常量。// 字符串常量(final修饰):字面量"Hello"存入运行时常量池。// 动态生成字符串,显式调用intern()后存入运行时常量池。存储字面量、解析后的符号引用(直接引用)、以及运行时动态添加的常量(如。// 符号引用:Object类在类加载时解析为直接引用。// final常量(基本类型):编译期替换为100。// 字面量"World"存入运行时常量池。

2025-04-18 00:15:40 682

原创 每天分享一个小知识————JVM内存区域之运行中常量池

/ "World"通过intern()动态加入运行时常量池。// 将"Hello"加入常量池(如果不存在)// false(s1在堆,s2指向常量池):像一本随时可以补充笔记的课本——既有原本印刷的内容(编译期常量),也能手写添加新内容(运行期常量)。类加载时,JVM把符号引用解析为直接引用(把“XX小区1号楼”翻译成具体坐标),并存到运行时常量池。:编译时写入(从Class文件的常量池加载) + 运行时动态添加(如通过。

2025-04-18 00:02:46 629

原创 每天分享一个小知识————JVM内存区域之方法区

存类信息、常量的“图书馆”,JDK 8前叫永久代(堆内),JDK 8后叫元空间(本地内存)。:规范说它是堆的一部分,但实际叫“非堆”(类似档案室在公司大楼里,但有独立管理规则)。// 每次调用生成一个新代理类。:热点代码(频繁执行的方法)编译后的机器码(类似常用书籍的速记版)。:元空间耗尽本地内存(如动态生成大量类,如反射、CGLib代理)。:类的所有实例被回收,且类加载器被回收(条件苛刻,极少发生)。:类的名字、字段、方法、父类、接口等(类似书的目录和内容)。

2025-04-17 23:47:57 625

原创 每天分享一个小知识————JVM内存区域之java堆

Java世界的“共享大仓库”,所有线程共用这个仓库存放对象(如你创建的。

2025-04-17 23:30:12 713

原创 每天分享一个小知识————JVM内存区域之本地方法栈

公司为了节省成本,让同一团队既处理内部邮件(Java方法)又处理外语邮件(本地方法),但内部依然区分两类邮件的处理流程。:管理外语(如C/C++)方法的“翻译笔记”,两者协作让Java既能处理内部逻辑,又能调用外部功能。JVM通过本地方法栈管理这个C/C++方法的执行(分配内存、记录调用状态等)。:大量创建线程并调用本地方法(每个线程的本地方法栈占用内存)。:处理海外客户的邮件(本地方法,用外语如C/C++编写)。本地方法栈 → 本地方法(如C/C++写的JNI方法)。

2025-04-17 23:21:06 573

原创 每天分享一个小知识———JVM内存区域之虚拟机栈

每个线程的“专属笔记本”,记录这个线程执行方法时的所有临时数据。

2025-04-17 23:13:44 886

原创 每天学一个小知识——JVM内存区域之程序计数器

假设一个办公室(处理器)有多个员工(线程),每个员工同时处理不同的任务。为了不互相干扰,每个员工都有自己的书签(程序计数器),记录自己任务当前的进度。程序计数器是线程私有的“代码执行进度条”,确保多线程环境下每个线程能独立记录自己的执行位置,且永远不会因内存不足而崩溃。程序计数器的作用类似,:程序计数器只存储一个指令地址(或空值),占用的内存极小,且每个线程独立分配,不需要动态扩容。:当线程被切换(比如时间片用完),程序计数器会记住当前执行的位置,下次回来时能无缝继续工作。(字节码指令的位置)。

2025-04-17 23:05:44 278

原创 12306高并发抢票系统-本地数据库的设置

1. navicat登录root用户,新建新的用户。给这个新建的用户分配操作一个数据库的权限。

2023-07-17 00:41:17 377

原创 12306高并发抢票系统-网关模块

6.加了上面的jvm参数后,会打印网关调用日志。3. properties文件配置。5.网关启动类jvm参数配置。1,新建module。2. pom文件配置。

2023-07-17 00:37:36 163

原创 12306-高并发抢票系统-第四章-3--代码关联git远程仓库

5、个人设置里配置ssh密钥,从git中复制过来。7、在idea的git控制台执行命令。6、在阿里云代码管理中新建代码库。4、登录阿里云的 云效代码管理。2、配置git邮箱和用户名。3、idea上提交到本地库。

2023-07-17 00:23:29 151

原创 12306-高并发抢票项目--第四章-2

4.2项目初始化配置。

2023-07-16 23:57:59 173

原创 12306高并发火车票项目----第四章-1

4-1手把手快速完成微服务架构的搭建。

2023-07-16 23:49:32 192

原创 JVM内核调优(一)

这个阶段也好理解,我们上面的字节码解读时,知道字节码里有的是直接 引用,有的是指向了其他的字节码地址。而符号引用验证的就是,这些引用的对应的内容是否合法。:到java语法级别了。1)类的加载就是将class文件中的二进制数据读取到内存中,然后将该字节流 所代表的静态数据结构转化为方法区中运行的数据结构,并且在堆内存中生成 一个java.lang.Class对象作为访问方法区数据结构的入口。加载到内存的过程是类加载器完成的,涉及到的加载器从上往下有 系统类加载器,扩展类加载器,应用类加载器,自定义加载器。

2022-12-19 11:16:38 103

原创 JAVA之IO流

输入流:读数据输出流:写数据。

2022-12-15 22:48:28 145 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除