每日一问
未读
【每日一问】方法区垃圾回收,如何判断一个类是无用的类?
在方法区垃圾回收中,判断一个类是否为无用类需同时满足三个条件:首先,该类的所有实例均已被回收,即Java堆中不存在该类的任何实例;其次,加载该类的ClassLoader已被回收;最后,该类对应的java.lang.Class对象未被任何地方引用,且无法通过反射访问其方法。这些条件必须全部成立,类才能被视为无用,从而可能被安全卸载以释放内存资源。
每日一问
未读
【每日一问】JVM有哪些垃圾回收算法?
JVM垃圾回收算法包括四种:标记-清除算法通过标记无用对象后清除回收,但效率不高且易产生内存碎片;标记-复制算法将内存分为两区,复制存活对象后清理,内存使用率仅半;标记-整理算法标记后移动存活对象并清理边界外内存,避免碎片;分代算法根据对象存活周期分新生代和老年代,新生代采用复制算法,老年代采用标记整理算法,优化回收效率。这些算法各有优缺点,分代算法是常用组合。
每日一问
未读
【每日一问】说说java虚拟机运行时数据区
Java虚拟机规范规定的运行时数据区分为5个部分。程序计数器是当前线程字节码行号指示器,支撑分支、循环等基础功能;Java虚拟机栈存储局部变量表、操作数栈、动态链接及方法出口等信息;本地方法栈类似虚拟机栈,服务于Native方法;Java堆是最大内存区域,所有线程共享,用于分配对象实例;方法区存储类信息、常量、静态变量及即时编译后的代码等数据。
Java
未读
【JVM篇】从源码角度分析JVM类加载机制
本文系统阐述了JVM的跨平台实现原理、Java编译过程及类加载机制。JVM通过将Java源码编译为平台无关的字节码(.class文件),再由各平台JVM解释或编译为本地机器码执行,实现“一次编译,到处运行”。javac编译过程包括词法分析、语法分析、语义分析、解语法糖等八个阶段,生成符合JVM规范的字节码。类加载子系统负责加载、验证、准备、解析和初始化类,采用双亲委派机制(Bootstrap/Extension/Application类加载器)确保类唯一性和安全性,避免核心库被篡改。特殊场景如Tomcat需打破双亲委派,通过自定义类加载器实现Web应用隔离和热部署。
GoLang
未读
Go 1.18 泛型全面讲解
Go 1.18正式引入争议已久的泛型特性,通过类型形参(Type Parameter)和类型实参(Type Argument)实现代码复用。其核心机制包括:
1. **泛型类型**:如 `type Slice[T int|float32] []T`,通过类型约束(Type Constraint)限定可接受的类型,实例化后(如 `Slice[int]`)才能使用。
2. **泛型方法**:泛型类型可定义方法(如 `(s MySlice[T]) Sum() T`),实现通用数据结构(如队列、栈)。
3. **泛型函数**:如 `func Add[T int|float64](a, b T) T`,支持自动推导类型实参。
接口被重新定义为“类型集”(Type Set),支持通过 `|` 组合类型或接口,并引入 `~` 指定底层类型、`any` 替代 `interface{}`、`comparable` 约束可比较类型等新特性。泛型适用于为不同类型编写相同逻辑的场景,可避免反射带来的性能损失和类型安全问题,但需注意其语法限制(如匿名结构体/函数不支持泛型)。
每日一问
未读
【每日一问】java创建对象的过程
Java创建对象的过程包括五个关键步骤:首先,JVM遇到new指令时进行类加载检查,确保类已加载、解析和初始化;未加载则先执行类加载。其次,分配内存:内存大小在类加载后确定,根据堆内存规整情况选择指针碰撞(用于规整堆,关联Serial/ParNew GC)或空闲列表(用于不规整堆,关联CMS GC)方式。接着,初始化内存为默认值,保证字段在未赋值时可用。然后,设置对象头,记录类实例、hash码、年龄段等基本信息。最后,执行开发人员编写的初始化方法,完成对象创建。整个过程确保对象安全高效地构建。
每日一问
未读
【每日一问】jvm优化原则是什么
JVM优化的核心原则是减少FullGC以最小化Stop-The-World(STW)时间,因为FullGC的STW远长于YoungGC。这通过让对象尽可能在新生代分配和回收实现,避免频繁进入老年代。对象进入老年代有四个条件:1)存活对象达到年龄阈值(默认15,可调);2)大对象直接进入(超过参数设置);3)动态对象年龄判定(Survivor区年龄总和超半时,年龄较大对象进入);4)Young GC后Survivor空间不足。优化建议:避免创建大对象,尤其是朝生夕死的大对象,并确保Survivor区足够大,使YGC后存活对象不超过其一半,从而有效减少FullGC次数和时间。
每日一问
未读
【每日一问】讲一下 JVM 的主要组成部分及其作用?
JVM由两个子系统和两个组件组成:类装载器(Class loader)、执行引擎(Execution engine)、运行时数据区(Runtime data area)和本地接口(Native Interface)。类装载器根据全限定名加载class文件到运行时数据区的方法区;执行引擎执行字节码指令;本地接口与本地库交互,支持其他语言;运行时数据区是JVM内存区域。整体上,Java代码编译为字节码后,类装载器加载到内存,执行引擎翻译为系统指令交CPU执行,通过本地接口调用本地库实现程序功能。
每日一问
未读
【每日一问】Tomcat如果使用默认的双亲委派类加载机制行不行,为什么?
Tomcat作为web容器需解决四个核心问题:不同应用依赖不同版本类库需隔离;相同版本类库可共享以节省资源;容器类库与应用类库隔离确保安全;支持JSP热加载无需重启。默认双亲委派类加载机制无法满足需求,因其仅基于全限定类名加载,无法区分版本冲突,且JSP修改后无法重新加载(类名相同时直接复用)。解决方案是为每个应用或JSP文件使用独立类加载器,实现隔离、共享和动态更新,如卸载并重建JSP加载器以支持热部署。
K8S-云原生
未读
Kafka 基本原理.md
Kafka是分布式流处理平台,基于ZooKeeper协调,支持高吞吐、分区多副本的消息处理。核心应用场景包括日志收集、消息系统解耦、用户活动跟踪及运营监控。其核心概念涵盖Broker(节点)、Topic(消息分类)、Producer(生产者)、Consumer(消费者)及Partition(有序分区)。设计上通过Controller选举管理集群,副本机制保障数据可靠性,HW(高水位)与LEO(日志末端位移)确保消息一致性。生产中需关注acks参数防消息丢失,手动提交offset避免重复消费,合理分区与消费组配置防止积压,并可通过JVM调优(如G1GC)提升性能。
Docker Registry 私有仓库搭建
本文介绍了Ubuntu系统下Docker的安装与私有Registry搭建流程。主要包括:
1. **Docker安装**:卸载旧版本后,通过APT配置HTTPS源、添加阿里云GPG密钥及软件源,安装docker-ce并启动服务;提供官方脚本自动安装方案。
2. **镜像加速器**:配置`daemon.json`使用网易/百度镜像源,重启服务生效。
3. **私有Registry搭建**:拉取registry镜像,启动容器并映射端口;解决HTTP信任问题(修改`daemon.json`或自建TLS证书)。
4. **API接口**:列出Registry V2的核心API方法(如获取镜像列表、上传下载等),并附官方文档链接。全文侧重实操步骤,关键配置均提供代码示例。
k3s集群搭建与Rancher部署
本文详细介绍了K3S与Rancher的部署流程,主要包含以下步骤:
1. **环境准备**:通过自动化脚本初始化CentOS7系统,安装依赖包、配置内核参数、关闭防火墙及SELinux,并安装Docker运行时。
2. **K3S部署**:在Master节点安装K3S Server,配置服务节点端口范围;Agent节点通过Token加入集群。同时部署NFS存储并配置默认StorageClass。
3. **证书管理**:生成自签名SSL证书,创建Kubernetes TLS密文,确保Rancher通信安全。
4. **Rancher安装**:使用Helm添加Chart仓库,通过私有证书方式部署Rancher,并设置初始访问密码。
5. **私有仓库配置**:配置containerd支持私有镜像仓库,包括证书认证和镜像加速。
6. **问题解决**:针对cgroup驱动不一致等常见问题提供解决方案。
全文涵盖系统初始化、集群部署、安全配置及运维优化,适用于轻量级Kubernetes环境搭建。
Git
未读
Git 版本标签
本文系统介绍了Git版本标签的管理方法,涵盖本地分支操作与标签全生命周期管理。核心内容包括:通过`git branch`查看/创建分支,`git checkout`切换分支;标签管理方面,支持用`git tag`创建轻量标签,`git tag -a -m`创建带注释的附注标签,并可通过指定commit id实现后期打标签;使用`git tag -l`按模式筛选标签,`git tag -d`删除本地标签,`git push origin --delete tag`删除远程标签;标签推送支持`git push origin <tag>`单标签推送或`--tags`批量推送。文末实例演示了从提交代码、打标签到推送删除的完整流程,为版本控制提供清晰指引。
Nginx
未读
CentOS 7 Nginx1.12.2平滑升级到新版本nginx-1.13.3
本文介绍了在CentOS 7上将Nginx从1.12.2平滑升级到1.13.3的方法。首先,使用`nginx -V`查看当前版本和编译参数。接着,下载nginx-1.13.3及openssl-1.1.0e源码,解压后进入目录,运行`./configure`复制旧参数并编译(避免`make install`)。备份旧二进制文件后,替换为新编译文件。处理PID文件,执行`make upgrade`命令自动测试配置、发送信号优雅切换进程。最后,验证版本升级成功。整个过程确保服务不中断。
Java
未读
Java 使用List的retainAll方法求交集
本文介绍了Java List的`retainAll`方法求交集的正确使用方式。该方法通过私有方法`batchRemove`实现:遍历当前集合,保留存在于参数集合中的元素,利用双指针和数组拷贝完成交集操作。关键点在于其返回值——它反映集合是否被修改(元素数量变化),而非是否存在交集:当两集合完全相同或无交集时,返回值分别为`false`和`true`。因此,正确判断交集应检查操作后集合大小是否大于0,而非依赖返回值。实现中通过`modCount`记录修改次数,确保操作安全性。
PHP
未读
为什么 in_array(0, ['a', 'b', 'c']) 返回true
文章解释了PHP中`in_array(0, ['a', 'b', 'c'])`返回true的奇怪现象:这是由于PHP的松散比较(默认行为)导致自动类型转换,非数字字符串如'a'、'b'、'c'在比较前转换为整数0,从而匹配。原因在于PHP的类型转换规则:字符串转int时,若首字符非数字则变为0。解决方案是使用严格比较(第三个参数设为true),如`in_array(0, ['a', 'b', 'c'], true)`返回false。类似地,`array_search()`和`0 == 'abc'`也因松散比较返回true;而false/null与字符串数组比较返回false,字符串与true数组比较时松散返回true(因字符串等于true)。严格比较可确保精确匹配,避免此类问题。
PHP
未读
深入浅出 PHP SPL(PHP 标准库)
PHP标准库(SPL)是PHP内置的一组接口与类集合,用于解决典型问题(如数据存储、遍历、自动加载等),自PHP 5.3起成为内核组件。其核心功能包括:
1. **数据结构**:提供双向链表(SplDoublyLinkedList)、栈(SplStack)、队列(SplQueue)、堆(SplHeap/SplMaxHeap/SplMinHeap)等标准数据结构实现。
2. **核心接口**:
- `Iterator`:实现自定义遍历,使对象可用于foreach循环。
- `ArrayAccess`:让对象支持数组式访问(如`$obj['key']`)。
- `IteratorAggregate`:聚合外部迭代器,分离数据与遍历逻辑。
3. **实用类**:如`SplFileInfo`(文件信息获取)、`SplFileObject`(文件操作)、`ArrayObject`(数组对象化)等,简化文件处理和数组操作。
4. **关键函数**:如`spl_autoload_register`(自动加载类)、`iterator_to_array`(迭代器转数组)等。
SPL通过标准化接口和类,提升代码复用性,是PHP开发高效、可维护代码的重要工具。
音乐天地

