Cloud Album
面向海外用户的私有云相册,围绕备份、整理和订阅体验持续打磨。
从真实产品研发出发,记录 iOS 客户端、MinIO 存储、海外支付与增长实验的完整过程。
产品
把技术文章沉淀成产品能力,也把产品研发过程继续写成文章。
面向海外用户的私有云相册,围绕备份、整理和订阅体验持续打磨。
从真实产品研发出发,记录 iOS 客户端、MinIO 存储、海外支付与增长实验的完整过程。
技术博客
Spring解决RocketMQ发消息与MySQL事务一致性
Garbage-First (G1) 收集器是一种服务器式垃圾收集器,针对具有大内存的多处理器机器。它以高概率满足垃圾收集 (GC) 暂停时间目标,同时实现高吞吐量。 Oracle JDK 7 update 4 及更高版本完全支持 G1 垃圾收集器。 G1 收集器专为以下应用而设计:
本教程介绍垃圾收集如何与 Hotspot JVM 配合使用的基础知识。了解垃圾收集器的功能后,了解如何使用 Visual VM 监控垃圾收集过程。最后,了解 Java SE 7 Hotspot JVM 中可用的垃圾收集器。 理解 GC 应先区分对象是否可达、何时触发回收以及收集器如何移动对象。实际优化的第一步是采集日志和指标,而不是盲目增大堆内存。
ubuntu20.04 快速安装kubernetes Ubuntu 20.04 和文中 Kubernetes 版本可能已进入旧维护阶段,命令不能直接套用于所有新版本。部署前应核对版本兼容矩阵,并为控制平面和 etcd 制定备份方案。
AbstractQueuedSynchronizer提供一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关的同步器(semaphores(信号量),events(事件)等)。
AQS 是 ReentrantLock、Semaphore、CountDownLatch 等并发工具的基础。阅读源码时应围绕状态获取失败后入队、线程挂起、前驱释放后唤醒这条主线理解。
Thread t = new Thread(new Runnable() {
@Override
public void run() {
}
});
t.start();
上面这段代码在JVM中是如何实现的呢?
调用 Thread.start 与直接调用 run 完全不同,前者会请求 JVM 创建新的执行线程。分析线程创建失败时应同时检查进程线程数、系统限制、容器配额和单线程栈大小。
接着上一篇mybatis 3.5.x源码系列(1) 我们继续研究一下mybatis的配置读取 MyBatis 将 SQL 执行拆分为多个职责明确的组件,并通过插件机制在关键接口处拦截。分析源码时应结合实际 SQL 和断点观察对象创建与调用顺序。
阅读 MyBatis 源码可以从一次 Mapper 方法调用向内追踪:代理如何确定 MappedStatement、参数如何转换、执行器如何发起 JDBC 请求。先掌握主链路,再分析缓存和插件更清晰。
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
回文字符串从中心向两侧对称,可以分别以单个字符和相邻两个字符作为中心扩展。该方法空间开销低,并能自然处理奇数与偶数长度回文。
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。 中位数问题的核心是找到合并后左半部分与右半部分的正确分界。简单合并易于验证,二分解法复杂度更优,但必须谨慎处理空数组、奇偶长度和哨兵边界。