- 博客(59)
- 资源 (25)
- 收藏
- 关注
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(七)
应用层优化算法复杂度优化(O(n²) → O(n log n))减少不必要的对象分配并发数据结构优化JVM层优化选择合适的GC收集器优化堆大小和区域设置JIT编译参数调优容器层优化正确配置资源限制确保JVM感知容器限制使用高效的文件系统内核层优化网络参数调优虚拟内存管理调度策略选择硬件层优化NUMA架构优化使用RDMA高速网络SSD替代HDD过度优化在未测量的情况下优化过早优化(未确定瓶颈)资源分配错误JVM堆大于容器内存CPU配额不足导致线程饥饿配置冲突同时启用多个GC收集器。
2025-06-20 17:51:22
321
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(六)
/ 实现自定义自旋策略@Overridefor (;;= 0) {// 自适应自旋64 : 0;// 使用CPU等待指令continue;// CAS获取锁@Override// 写操作后插入StoreLoad屏障acquire(1);release(1);// 测试用例// 启动10个线程i < 10;t.start();
2025-06-20 10:13:14
787
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(五)
通过深入理解新一代垃圾收集器的工作原理和性能特性,结合业务需求选择最佳GC策略,可以显著提升系统吞吐量,降低延迟,实现系统性能的质的飞跃。堆内存>64GB:选择Shenandoah分代模式。要求10ms内暂停:选择Shenandoah。JDK17+:ZGC或Shenandoah。堆内存<64GB:选择G1 GC。:仅需42位地址空间(4TB):基于历史数据预测最佳GC策略。要求亚毫秒级暂停:选择ZGC。:GC状态直接存储在指针中。:无需额外内存存储转发信息。首选ZGC(线性扩展性)- 最大GC暂停时间。
2025-06-20 03:00:36
388
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(四)
解释器:快速启动,低效执行C1编译器:快速编译,中等优化C2编译器:深度优化,高质量代码Graal编译器:新一代JIT,支持高级优化方法内联:消除调用开销(核心优化)逃逸分析:实现栈上分配和标量替换循环优化:展开和向量化提升计算效率去虚拟化:优化多态调用Graal原生镜像:AOT编译技术(机器学习优化:基于Profile的预测优化多语言支持:通过Truffle框架支持多语言硬件加速:集成GPU和FPGA计算。
2025-06-18 04:45:05
618
原创 分库分表查询实现方案详解
分库分表查询的核心在于如何高效地定位数据位置并合并查询结果。基于ShardingSphere-JDBC:轻量级客户端方案,适合Java应用基于MyCat中间件:代理层方案,对应用透明分布式数据库方案:TiDB等原生分布式数据库实时分析分离架构:将分析查询导向数仓精心设计分片键智能查询优化器HTAP混合负载处理多模型数据支持云原生分布式数据库优化分页查询(游标分页)合理使用绑定表和广播表读写分离减轻负载最终一致性替代分布式事务。
2025-06-18 02:17:24
950
原创 物联网设备监控与控制系统实现详解(思路仅供参考,节选自亲身实战项目)
多协议接入:支持MQTT和TCP/UDP协议接入多种设备设备类型适配:针对门禁、道闸、访客机、空调、冰箱、锅炉等设备实现专用处理实时数据处理:设备数据采集、解析、存储和实时监控设备控制:支持远程控制指令下发图片抓取:门禁设备抓拍图片存储与展示告警系统:设备异常状态实时检测与通知数据可视化:设备状态、历史数据、地理分布的直观展示系统安全:设备认证、授权和数据加密传输。
2025-06-17 05:15:54
911
原创 Spring Boot + Spring Security + 自定义注解实现数据权限控制(含前后端代码)
*** 租户字段名(默认tenant_id)*//*** 部门字段名(默认dept_id)*//*** 用户字段名(默认user_id)*//*** 数据范围类型*//*** 额外过滤条件*/// 数据范围枚举ALL, // 所有数据TENANT, // 当前租户DEPT, // 当前部门DEPT_AND_SUB, // 当前部门及子部门SELF, // 仅自己数据CUSTOM // 自定义条件2.2.2 字段权限注解/*** 角色类型。
2025-06-17 04:16:51
652
原创 SpringBoot 线程池 配置使用详解
ThreadPoolTaskExecutor 是 Spring 生态中管理线程任务的利器,通过灵活的配置和与 Spring 的无缝集成,能够高效处理异步任务、高并发请求和定时调度。注解定期监控线程池的状态,包括活动线程数、当前线程数、核心线程数、最大线程数、队列大小和已完成任务数等,帮助开发者了解线程池的运行情况,以便及时进行优化和调整。:是 Spring 提供的一个线程池任务执行器,通过设置核心线程数、最大线程数、队列容量等参数,可以根据应用的需求灵活地配置线程池。例如,当线程池满时,
2025-06-16 18:18:53
837
原创 MySQL 10亿条数据分析处理方案
程序解题:mysql数据库中有10亿条数据(订单记录1.9亿条、交易记录1.2亿条、用户记录290万,会员75万,日志记录5.6亿条,剩下的是管理数据),该数据总大小1.51TB,现要对该10亿条数据做统计分析和排序(年账单、月账单,月人均消费金额等),现在有一台32核64G内存200GSSD硬盘,用作应用服务器来处理统计分析,给出解题过程。
2025-06-16 15:15:32
1307
原创 HashMap底层实现原理深度剖析
HashMap是Java集合框架中最重要且使用最频繁的集合类之一,它基于哈希表实现,提供了高效的键值对存储和检索功能。理解HashMap的底层实现原理对于编写高效、健壮的Java程序至关重要。// 创建HashMap实例// 添加键值对populationMap.put("北京", 2154);populationMap.put("上海", 2424);populationMap.put("广州", 1868);populationMap.put("深圳", 1756);// 获取值。
2025-06-16 14:16:18
993
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(三)
本文深入解析了JVM三大核心内存区域的运作机制,结合实验数据与真实案例,由于篇幅原因,实例都是代码片段,相信优秀的你知道提供的代码如何使用。每个线程初始化时在Eden区申请私有TLAB空间(默认约Eden的1%)Slot为最小单位(32位,long/double占2 Slot)TLAB用尽时申请新TLAB(触发全局锁竞争)对象优先在TLAB内无锁分配(指针碰撞实现)Metaspace使用量持续增长直至。:频繁申请新缓冲区,增加全局锁竞争。每次递归在栈上分配新帧(含局部变量。Metaspace使用量达到。
2025-06-16 13:40:39
582
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(二)
实现步骤继承java.lang.ClassLoader重写findClass()方法在findClass()中读取字节码调用defineClass()定义类示例:数据库类加载器@Override// 1. 从数据库读取字节码// 2. 定义类")) {类加载时机:由JVM规范严格定义,主要发生在首次主动引用时加载过程三阶段加载:定位字节码并创建Class对象链接:验证、准备和解析初始化:执行<clinit>方法双亲委派模型:保障安全性和一致性的核心机制。
2025-06-13 18:06:30
847
原创 Java虚拟机解剖:从字节码到机器指令的终极之旅(一)
Class文件结构:严格定义的二进制格式,包含魔数、版本号、常量池等关键部分字节码指令集:包含200+指令,分为加载/存储、运算、类型转换等类别i++ vs ++i:后缀自增先取值后运算,前缀自增先运算后取值方法调用机制invokevirtual:基于虚方法表的静态绑定invokedynamic:动态绑定,支持Lambda等现代特性Lambda实现:通过invokedynamic+引导方法+运行时生成类实现性能优化:现代JVM对字节码有深度优化(如方法内联、逃逸分析)
2025-06-12 23:30:17
999
原创 数据一致性校验算法
附:Tcp保证可靠性一部分是通过Tcp协议报头体现出来的,还有一部分是通过实现Tcp的代码逻辑实现出来的,比如超时重传机制就是在发送方发出数据后开启了一个定时器,这就是通过Tcp的代码逻辑体现出来的,这在Tcp报头中是体现不出来的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。收到数据后,再次计算1的个数,并根据校验位的设置验证数据的完整性。
2025-05-20 19:54:19
532
原创 Linux之安装配置Nginx
使用wget命令或直接在浏览器中下载Nginx的安装包(如nginx-xx.xx.xx.tar.gz)。通过编辑这个文件,可以修改Nginx的监听端口、服务器名称、日志文件路径等配置。:确保Linux系统已安装,并且具有网络连接(以便在线安装依赖或下载Nginx)。: 进入Nginx的安装目录下的sbin目录,执行nginx启动脚本。选项指定Nginx的安装路径,以及其他一些可选的配置选项。命令访问Nginx服务的默认页面(通常监听在80端口)。: 进入解压后的Nginx目录,执行配置脚本。
2025-04-24 23:08:35
604
原创 HTTP协议(一)
HTTP的历史发展历程HTTP(HyperText Transfer Protocol,超文本传输协议)已经发展了几代,每一代都带来了显著的改进和优化。
2025-04-22 02:40:39
245
原创 MySQL之索引优化
例如下面显示的结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。例如下面的语句中,最好把actor_id 和 film_id 设置为多列索引。如:'%ptd_' 和 '%ptd_%' 都没有用到索引;优化方式:用代码拼装sql时进行判断,没where加where,有where加and。优化方式:如果是连续数值,可以用between代替。优化方式:可以给字段添加默认值0,对0值进行判断。优化方式:可以用union代替or。
2024-07-22 17:31:10
589
原创 CMS收集器原理详解
另外一种情况是没有配UseCMSInitiatingOccupancyOnly,这时候又有两种小的分支情况,一个是当老年代是因为分配对象而成功扩容的,这时候会触发background gc(足以看出-xmx 和 -xms设置成一样的重要性),第二个是一个非常复杂的情况,这个和CMS老年代的空闲链表有关系,复杂的原因是freeList这玩意本身的复杂度就是非常高的,简单的说此时CMS的后台线程判断FreeList中的空间不足以分配新的下一次晋升到老年代的对象时候,就会触发background gc。
2024-07-19 13:17:28
1135
原创 四种垃圾收集算法详解(JVM)
标记整理和标记清除的非常相似,但是标记整理的过程是这样的,首先是标记要清理的对象,然后将剩下所有存活的对象都移动到一端,然后直接清理端边界以外的内存。其实也就是标记-整理-清除算法,多了一个对内存的整理的过程。将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。:与标记清除算法相同,标记阶段会遍历整个堆内存,找出所有存活的对象(即被引用的对象),并给它们打上标记。
2024-07-19 12:30:25
1055
原创 Linux之shell应用(语法进阶)
的值得到的是 0,也就是上一条 echo 命令的结果,而 demoFun1 的返回值被覆盖了。为 0,如果找不到,则返回值 $?之后再用函数的 return 值作为测试,其中 demoFun1 返回值为 0,demoFun2 返回值选择了任意一个和 0 不同的整数,这里为 12。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...将函数作为条件语句交给 if 判断,得出返回值为 0 时,依然为 true,而返回值只要不是 0,条件语句都判断为 false。
2024-07-18 17:21:15
806
原创 Linux之shell应用(语法讲解)
需要注意的是,在 for 循环中,变量的赋值使用的是in关键字,而不是等号(=)。当执行这个命令后,Shell 会将脚本的每一行命令都显示出来,并在命令执行之前先输出该行命令。与单括号不同,双括号内的变量可以不使用引号进行包裹,这意味着在条件测试中可以直接使用变量而不必担心特殊字符的影响。是扩展的条件测试结构,提供了更多的功能和便利性,可以进行更灵活的条件判断。是用于执行算术运算和逻辑运算的结构,在其中可以使用变量和运算符进行数值计算和逻辑判断。的值等于 "abc",则条件被认为是真,输出 "条件满足"。
2024-07-18 13:42:53
1085
原创 Linux文本工具之-Vim(二)
输入命令 :saveas newfile.txt 将会在当前目录下创建一个名为 “newfile.txt” 的副本,并将文本保存到该文件中。在命令模式下,输入 :wq 将会将文本保存到文件中,并退出 Vim 编辑器。:n 或者 :wn:在普通模式下,输入 :n 或者 :wn 可以切换到下一个文件并保存当前文件。:N 或者 :wN:在普通模式下,输入 :N 或者 :wN 可以切换到上一个文件并保存当前文件。U:按下大写的 U 键可以撤销对整行的所有修改,将行恢复到上一次保存时的状态。
2024-07-17 18:33:29
1035
原创 Linux文本工具之-Vim(一)
在普通模式下敲击键盘的 v 键即可进入可视模式,然后移动光标就可以选中一块文本,常用来完成文本的复制、粘贴、删除等操作。替换模式(Replace mode): 在替换模式下,您可以直接替换光标所在位置的字符。先将光标移动到指定内容的起始位置,按v进入可视模式,通过l向后选择,通过j向下选择,通过h向前选择,直到光标到达选中内容的尾部。Ex 模式是Vim的可选模式,它是命令行模式的扩展。yy是复制光标当前行,p是粘贴复制的行到光标下方行,当光标选中的非行数据时不包含\n,所以p粘贴时在光标后。
2024-07-17 18:05:56
825
1
原创 Nginx编译安装参数详解
它只能从服务器到客户端方向,只有一个字节的字符可以转换。--without-http_autoindex_module 禁用ngx_http_authindex_module,该模块用于在ngx_http_index_module模块没有找到索引文件时发出请求,用于自动生成目录列表。--without-http_gzip_module 禁用ngx_http_gzip_module支持,同--with-http_gzip_static_module功能一样。
2024-07-16 16:49:05
1314
原创 插入排序(Java)
最好情况:序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况如下。最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。2、取出下一个元素,在已经排序的元素序列中从后向前扫描。直接插入排序属于稳定的排序,最坏时间复杂度为O(n^2),5、将新元素插入到该位置。
2023-12-07 22:34:20
525
原创 Linux常用命令(二)
locate命令可以在搜寻数据库时快速找到档案,locate为模糊查找,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab)grep 命令里的匹配模式,就是你想要找出来的数据,可以是普通的文字符号,也可以是正则表达式;
2023-12-05 23:31:33
1023
原创 JVM的内存结构详解「重点篇」
另外一种退出方式是,在方法执行过程中遇到了异常,并且这个异常没有在方法体内得到处理,无论是Java虚拟机内部产生的异常,还是代码中使用athrow字节码指令产生的异常,只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出,这种退出方式称为异常完成出口(Abrupt Method Invocation Completion)。当一个方法刚刚执行的时候,这个方法的操作数栈是空的,在方法执行的过程中,会有各种字节码指向操作数栈中写入和提取值,也就是入栈与出栈操作。6、虚拟机栈是一个后入先出的栈。
2023-12-02 18:42:43
1209
原创 冒泡排序的几种实现(直接源码)
算法专栏主要是实操类源码,都是跑的通的代码,复制即可用,代码都是简单通俗的实现,没有做复杂的封装,易于学习算法的思维逻辑。
2023-11-29 23:12:55
389
原创 linux常用命令(一)
Options:内存单位:默认情况下,free命令以千字节(Kilobytes,KB)为单位显示内存大小。可以使用"-b"参数以字节(Bytes)为单位显示内存大小。可以使用"-k"参数以千字节为单位显示内存大小。可以使用"-m"参数以兆字节(Megabytes,MB)为单位显示内存大小。可以使用"-g"参数以吉字节(Gigabytes,GB)为单位显示内存大小。内存信息:总内存(Total):显示系统的总内存大小。已使用内存(Used):显示当前已被分配和使用的内存大小。
2023-11-29 22:30:15
1367
原创 JVM之引用类型
在实际程序设计中一般很少使用弱引用与虚引用,使用软用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生,学好引用类型也是高效编程的基础哦。
2023-11-29 20:23:38
386
原创 JVM配置参数详解
当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大 小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓 慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部 分空间。
2023-11-27 20:24:33
3316
原创 linux命令学习之环境准备
基于linux的环境我主要说阿里云的ecs吧,如果为了学习linux最实惠的办法无非就是购买一个包年的ECS,不要求高环境,1核1G+20G存储足够用了,我这里不是给阿里云打广告哈,如果能赶上腾讯云做学生活动有可能能49买一个三年的ECS只不过特别卡。由于本人使用的是mac电脑,开发环境基本在macos环境和centos环境,所以在windows上的安装步骤就无法详细描述了。它是一个在 Windows 上运行 Linux 命令的工具,提供了一个 Linux-like 的终端环境。
2023-11-23 00:53:52
63
原创 JVM之类加载器原理
但并非所有的应用都适合采用 OSGi 作为基础架构,它在提供强大 功能同时,也引入了额外的复杂度,因为它不遵守了类加载的双亲委托模型。加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。验证阶段非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。
2023-11-22 23:57:37
43
软件工程Spring应用配置文件统一规范:涵盖YML格式、环境配置与日志管理规则了文档的核心内容
2025-04-24
【微服务架构】Nacos Client服务注册与配置管理:Spring Cloud应用服务发现与配置中心集成指南
2025-04-25
【微服务架构】Eureka注册中心迁移到Nacos实施方案:服务注册与配置管理优化设计
2025-04-24
【医学影像设备】2024医学影像设备行业研究报告:市场规模、竞争格局与国产化进程分析介绍了医学影像设备
2025-04-22
jdk-8u421-windows-i586版本,安装后java版本为:1.8.0-421
2024-07-22
版本管理-git(管理约定)
2023-11-19
经典排序代码实现及分析
2022-05-31
java mail开发所需jar包
2010-12-15
最新tomcat日志查看包
2010-05-24
最新最全的spring开发包
2010-05-24
oracle数据库驱动包
2010-12-14
struts2+spring2.5+hibernate3.1整合包
2010-12-15
生成exe可执行文件工具
2010-12-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人