- 博客(255)
- 资源 (8)
- 收藏
- 关注
原创 网站统计中的数据收集原理及实现
网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascript的。本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统。
2024-04-06 21:12:22
1358
原创 浅谈偏向锁、轻量级锁、重量级锁
为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题,几种锁的分配和膨胀过程,有助于编写并优化基于锁的并发程序。内置锁的分配和膨胀过程较为复杂,限于时间和精力,文中该部分内容是根据网上的多方资料整合而来;仅为方便查阅,后面继续分析JVM源码的时候也有个参考。如果对各级锁已经有了基本了解,读者大可跳过此文。
2024-04-05 21:15:13
925
原创 一个故事告诉你比特币的原理及运作机制
周末花时间看了一些比特币原理相关的资料,虽然不敢说把每个细节都完全搞懂了,不过整体思路和关键部分的主要原理还是比较明白。写一篇文章分享给大家。这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来。这篇文章不会涉及算法和协议中比较细节的部分,打算后面会再写一篇程序员视角下的比特币原理,那里会从技术人员的视角对比特币系统中较为关键的数据结构、算法和协议进行一些讲解。
2024-04-05 21:14:44
1487
原创 浅谈TCP(2):流量控制与拥塞控制
上文浅谈TCP(1):状态机与重传机制介绍了TCP的状态机与重传机制。本文介绍流量控制(Flow Control,简称流控)与拥塞控制TCP依此保障网络的QOS。
2024-04-04 11:27:26
1082
原创 “光”速?HakariCP为什么这么快?
这次源码探究,真的感觉看到了无数个小细节,无数个小优化,积少成多。平时开发过程中,一些小的细节也一定要“扣”。“光”速?HakariCP为什么这么快?
2024-04-04 11:26:26
1153
原创 Linux文件系统目录结构
本文以CentOS系统为例,但同样适用于Linux的其他发行版。不需要纠结于具体的版本,即可。本文随时更新。除勘误外,不另做批注。
2024-04-03 18:27:32
644
原创 Java高并发综合
这篇文章是研一刚入学时写的,今天整理草稿时才被我挖出来。当时混混沌沌的面试,记下来了一些并发的面试问题,很多还没有回答。到现在也学习了不少并发的知识,回过头来看这些问题和当时整理的答案,漏洞百出又十分可笑。发表出来权当对自己的一个提醒——如果不能一直进步,你就看不到当初傻逼的自己。曾经,我在面试Java研发实习生时最常听到的一句话就是:搞Java怎么能不学并发呢?没错,真的是经过了面试官的无数鄙视,我才知道Java并发编程在Java语言中的重要性。
2024-04-03 18:27:15
892
原创 源码|并发一枝花之CopyOnWriteArrayList
CopyOnWriteArrayList的设计思想非常简单,但在设计层面有一些小问题需要注意。JDK版本:oracle java 1.8.0_102本来不想写的,但是github上CopyOnWriteArrayList的code results也有165k,为了流量还是写一写吧。
2024-04-02 09:38:26
571
原创 源码|并发一枝花之ConcurrentLinkedQueue
现在基于假设1和假设2,尝试定义入队模型的状态机。存在2个生产者P1、P2,同时触发入队操作。
2024-04-02 09:38:05
1019
原创 源码|从串行线程封闭到对象池、线程池
相对于线程封闭,串行线程封闭离用户的距离更近一些,简单灵活,实用性强,很容易掌握。而线程封闭更多沦为单纯的设计策略,单纯使用线程封闭的场景不多。线程池与串行线程封闭、对象池的关系不大,但经常被混为一谈;没看过源码的很难想到其实现方案,面试时也能立分高下。线程池的实现很有意思。在追源码之前,猴子一直以为线程池就是把线程存起来,用的时候取出来执行任务;看了源码才知道实现如此之妙,简洁优雅效率高。源码才是最好的老师。原文地址:源码|从串行线程封闭到对象池、线程池。
2024-04-01 10:32:11
849
原创 MySQL索引背后的数据结构及算法原理
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。
2024-04-01 10:31:52
1842
原创 线程池ThreadPoolExecutor总结
keepAliveTime,unit:如果线程池中的线程数大于corePoolSize小于等于maximumPoolSize,则选择闲置时间超过keepAliveTime(单位为unit)的线程销毁,直到无线程可销毁或线程数等于corePoolSize。相对的,CachedThreadPool被设计为一种maximumPoolSize无效的缓冲池,同时,因此,必须使用无界的同步队列,让“入队”直接变成“执行”。个线程的线程池,限制线程可缓存60s,超时销毁;
2024-03-31 17:11:45
785
原创 源码|ThreadLocal的实现原理
ThreadLocal也叫“线程本地变量”、“线程局部变量”:其作用域覆盖线程,而不是某个具体任务;其“自然”的生命周期与线程的生命周期“相同”(但在JDK实现中比线程的生命周期更短,减少了内存泄漏的可能)。ThreadLocal代表了一种的思想,从而达到线程封闭的目的,帮助我们设计出更“健康”(简单,美观,易维护)的线程安全类。JDK版本:oracle java 1.8.0_102。
2024-03-31 17:11:17
1006
原创 AQS的基本原理
state表示状态,其他状态需要自行维护直接使用不带try前缀的方法,并覆写带try前缀的方法对于带try前缀的方法,约定通过返回值告知调用者(一般是AQS)获取或释放操作的结果本文虽短,且非常重要,是后文分析ReentrantLock等的基础。同时,又是一个高效并发的经典设计案例。AQS的基本原理。
2024-03-30 16:38:14
728
原创 Spring Boot HandlerMethodArgumentResolver 使用和场景
为了将 HTTP 请求参数转换为 Java 对象,我们需要创建一个自定义的实现类。在这个类中,我们需要实现方法和方法。要在 Spring Boot 应用程序中使用自定义的实现类,我们需要将其注册到应用程序上下文中。为此,我们可以创建一个类,并实现接口。在这个类中,我们需要重写方法,并将自定义的实现类添加到参数解析器列表中。@Override要在 Spring Boot 应用程序中使用自定义的实现类,我们需要将其注册到应用程序上下文中。为此,我们可以创建一个类,并实现接口。在这个类中,我们需要重写。
2024-03-30 16:37:34
1855
原创 Java中如何恰当的表达“继承”与“扩展”的语义?
到这里,希望你能明白扩展与继承的区别。现在回答题目的问题,Java中如何恰当的表达“继承”与“扩展”的语义?仅表达继承用B类继承或C类继承仅表达扩展用A类继承或简化的D类继承(不继承接口)同时表达继承和扩展用D类继承PS:要真正理解extends、implements与继承的关系。extends从一个类扩展出另一个类,implements从一个接口实现一个类或抽象类,它们作为Java中的关键字,语义本身是正确的;只是与面向对象中的继承无法一一对应。
2024-03-29 09:57:02
642
原创 volatile关键字的作用、原理
综上,其实volatile保持内存可见性和防止指令重排序的原理,本质上是同一个问题,也都依靠内存屏障得到解决。更多内容请参见JVM相关书籍。volatile关键字的作用、原理。
2024-03-29 09:56:40
1011
原创 算法分析中递推式的一般代数解法
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式。例如汉诺塔问题的时间复杂度递推形式为,可以解出封闭形式为(设初始状态)。因为递推式求解的重要性,许多算法书籍对其有专门介绍。Donald Knuth在Concrete Mathematics一书中多个章节都涉及递推式求解方法。算法导论也在第四章中专门论述的这个主题。在这些相关论述中,主要介绍了一些启发式方法,这些方法往往需要一些特殊的技巧和灵感才能完成。
2024-03-28 09:34:21
606
原创 SAML2.0详解,助力企业级SSO
在国内,提到认证授权、单点登录(SSO),第一时间想到的大多是OAuth 2.0。OAuth 2.0 是一个开放标准,在国内的技术社区中得到了广泛的支持和推广,许多互联网公司以及开发者积极采用。还有一点就是国内的许多场景更关注于授权而非认证,OAuth 2.0 专注于授权机制,允许用户授权第三方应用程序访问其存储在另一个服务提供者上的资源,而无需共享用户名和密码,这种机制非常适合于社交媒体、移动应用、开放平台等场景。今天我想说的是一种不一样的声音,今日的主角并不是 OAuth 2.0,而是。
2024-03-28 09:34:09
2821
原创 浅谈双亲委派模型
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。很多人对“双亲”一词很困惑。
2024-03-27 09:39:21
567
原创 String常量池和String#intern()
String是Java基础的重要考点。可问的点多,而且很多点可以横向切到其他考点,或纵向深入JVM。本文略过了String的基本内容,重点在于String#intern()。
2024-03-27 09:39:02
714
原创 数组还可以这样用!常用但不为人知的应用场景
数组在Java中是一种基本的数据结构,可以表示连续的内存空间。它可以用来存储一组相同数据类型的元素。Java中的数组可以是一维或多维的,而且数组的大小一旦确定就无法更改。本文将介绍数组的几种常用但不为人知的应用场景,包括二维数组的应用,数组的旋转、查找、去重等操作,以及在算法中使用数组等场景。并且将分析这些应用场景的优缺点,并提供相应的示例代码和测试用例。这表示创建一个3行4列的二维数组。这种方式可以直接初始化二维数组的每个元素。
2024-03-26 17:33:39
846
原创 聊聊 Java GC
在遍历GC Roots 对象树的时候,同时将标记到得对象复制到新生代小的S0/S1内存区域中,这样,当我们遍历完对象空间的时候,可以将整个新生代Eden区域内存分配的当前有效内存开始指针置为开始位置,这样,我们就操作完了对新生代对象的GC回收。从上文的对象定位可以看到,一般情况下,java对象都是在堆上分配,然后其引用指针保存在调用栈对应位置,然后在访问的时候,需要两次查找才能获取完所有的需要的对象信息,而在栈上分配对象内存的话,就避免了这个耗时。因此,在S1上,就存在不同分代年龄的对象了。
2024-03-26 17:33:21
2232
原创 HashMap实现原理
HashMap是常考点,而一般不问List的几个实现类(偏简单)。以下基于JDK1.8.0_102分析。JDK版本:oracle java 1.8.0_102。
2024-03-25 09:34:16
830
原创 「探索Java中的EnumMap:利用枚举类型优化Map实现」
在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。在Java中,EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在本篇文章中,我们将会介绍EnumMap的概念、使用方法和实现原理,并且会通过一些例子来展示EnumMap的使用。本篇文章主要介绍Java中的EnumMap,包括EnumMap的概念、使用方法、实现原理以及一些例子。EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。
2024-03-25 09:33:12
1691
原创 从抛硬币试验看概率论的基本内容及统计方法
这篇文章以抛硬币试验为引子引出了一系列现代数学中概率的基本模型、定理及基本的估计及显著性检验方法。写这篇文章是我无聊抛硬币时一时兴起,其中对很多东西只是给出一个轮廓,没有处处给出严格的定义和证明,不过大约说明了常用的一些统计方法及其理论基础,限于篇幅不能面面俱到,例如一个假设检验如果展开写可以单独写一篇文章。目前随着大数据概念的热炒,基于互联网的数据挖掘和机器学习也变得火热,其实很多数据挖掘和机器学习都是基于概率和统计理论的,很多方法甚至只是传统统计方法的应用。
2024-03-24 11:34:45
3239
原创 为什么算法渐进复杂度中对数的底数总为2
在分析各种算法时,经常看到(O(\log_2n))或(O(n\log_2n))这样的渐进复杂度。不知有没有同学困惑过,为什么算法的渐进复杂度中的对数都是以2为底?为什么没有见过(O(n\log_3n))这样的渐进复杂度?本文解释这个问题。
2024-03-24 11:34:03
364
原创 x86-64体系下一个奇怪问题的定位
从上述过程知道,最初的笔试代码,在64位环境下,浮点数参数被送入mmx寄存器,而%d告诉printf第一个参数为int类型,所以printf仍然去默认的esi中寻找第一个int参数,所以从esi中读取了一个未确定的32bit数据并按int解释,最终造成结果的不确定。所以这道题的正确答案(小端序)是,在32位下,输出为“a = 0”;在64位启用SIMD情况下,输出结果不确定。
2024-03-23 10:02:16
1027
原创 一文搞懂Log4j2的同步日志打印
Log4j2诞生于2012年,是Apache推出用于对标Logback的日志框架,本篇文章将对Log4j2的同步日志打印的源码进行学习。Log4j22.17.1本篇文章主要是从使用Log4j2日志框架时,日志打印器Logger的获取,的获取以及实际一条日志的打印进行的讨论。对于日志打印器Logger的获取,我们在应用程序中,获取到的日志打印器实际就是,但是实际打印日志是由其持有的来完成,而是有一个父子层级的关系在里面,也就是说name为的日志打印器的会优先取name为com.lee和com的日志打印器的。
2024-03-23 10:00:41
847
原创 总结java研发过程中一些实用的工具/类/方法/特性
动态方案的缺陷在于大量的反射调用,性能比较差,内存占用多,不适合特别高并发的应用场景。业务常用的方式是@Slf4j带的日志,不会有上面的风险,先定义一个Logger,然后支持不同级别的输出如fine()/info()/error()等。线上机器部署多个集群的时候,流量大的时候一定能打到某个机器,访问量不多的时候,比如预发就两台机器pods,从webshell进入,这个时候请求负载均衡不确定路由到哪一台,可以两边都开着,然后监听访问,区分读还是写的请求,如果是读接口,可以多点几下,肯定有一些会路由到的。
2024-03-23 10:00:28
714
原创 FastJson序列化隐藏特性
针对训练模型控制台的web后端维护,新增了一个int类型的maxTokenLimit字段,表示调用GPT模型请求允许的TokenSize上限值。后端添加好之后,数据库里面这个字段项没有填充数值,默认是空,所以理论上当maxTokenLimit字段为空的时候,应该传输的Json内容为maxTokenLimit: null ,但是前端那边F12查看,反馈接收到后端传参里面并没有这个字段。
2024-03-22 10:35:41
819
原创 SQL中为什么不要使用1=1?
1=1”在SQL语句中可能看起来无害,但实际上它是一种不良的编程习惯,可能会导致性能下降。就像在做饭时不会无缘无故地多加调料一样,我们在编写SQL语句时也应该避免添加无意义的条件。每一行代码都应该有它存在的理由,不要让你的数据库像一个困惑的图书管理员,浪费时间在不必要的事情上。
2024-03-22 10:35:12
620
原创 Java内存模型
JVM的内存结构大概分为:堆(heap):线程共享,所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。方法区(MEATHOD AREA):线程共享,存储类信息、常量、静态变量、即时编译器编译后的代码。方法栈(JVM Stack):线程私有、存储局部变量表、操作栈、动态链接、方法出口,对象指针。本地方法栈(NATIVE METHOD STACK):线程私有。为虚拟机使用到的Native 方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行。
2024-03-21 09:32:01
935
原创 一文搞懂跳表原理及实现
跳表可以达到和红黑树一样的时间复杂度O(logN),且实现简单,Redis中的有序集合对象的底层数据结构就使用了跳表。本篇文章将对跳表的实现进行学习。跳表的时间复杂度与AVL树和红黑树相同,可以达到O(logN),但是AVL树要维持高度的平衡,红黑树要维持高度的近似平衡,这都会导致插入或者删除节点时的一些时间开销,所以跳表相较于AVL树和红黑树来说,省去了维持高度的平衡的时间开销,但是相应的也付出了更多的空间来存储多个层的节点,所以跳表是用空间换时间的数据结构。
2024-03-21 09:31:44
1758
原创 Java 多线程线程池分析
关于Java多线程的知识,看了很多博客书籍,对理论还是比较了解的。但是,最近写一个很简单的使用线程池对列表中任务进行处理,然后返回结果列表的功能,发现理论和实际操作还是有相当大的差距。/*** @author: ketao Date: 14-5-3 Time: 下午4:51*/@Overridetry {});
2024-03-20 09:34:07
550
原创 Nginx模块开发入门
(Nginx本身支持多种模块,如HTTP模块、EVENT模块和MAIL模块,本文只讨论HTTP模块)Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。
2024-03-20 09:33:47
922
原创 体系化全面认识 Nginx !
请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。子进程通过读取共享内存的数据,来获取后端服务器的信息。
2024-03-18 10:01:20
2142
java sigar获得服务器信息
2018-05-08
大型网站分布式技术架构书(集合)
2018-04-18
TCP-IP详解 卷一、二、三 非扫描
2018-04-17
Java TCPIP Socket编程 源码
2018-04-08
大话JAVA:从零基础到数据库、WEB开发.
2018-04-04
《Java加密与解密的艺术》源码
2018-04-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅