- 博客(422)
- 资源 (26)
- 问答 (1)
- 收藏
- 关注
原创 阿里巴巴 arthas的MathGame源码是什么
阿里巴巴开源的arthas是一个非常优秀的在线调试工具,为了方便学习者练习,提供了一个demo程序MathGame,并且发布在github中,不过呢,国内有时打不开,此时我们可以使用源码直接在我们的idea中启动,那该文件的源码是什么呢?该代码非常简单,就是不断生成一个随机数,然后判断是不是素数。
2023-07-30 10:12:49
394
原创 HttpClient使用MultipartEntityBuilder上传文件时乱码问题解决
经过debug发现,经过foreach之后,builder里的参数的字符集都是Consts.ISO_8859_1,很明显这应该就是问题所在,那研究一下MULTIPART_FORM_DATA就非常必要了。files.forEach这一行明显是上传文件的而params.forEach是用来传递参数的。问题就出在params里的中文成了乱码。最后只能自己理解源码,来研究如何做。在测试的时候参考了这里的部分内容。这是整个方法的完整实现,但是仍然不能解决问题。
2023-07-19 19:54:23
1480
原创 疫情之后,算法会在面试中怎么考
新冠终于和冬天一样慢慢走了,各行各业也逐步迎来了新生。很多人苟了一年之后,有的人希望升职加薪,还有很多人是“毕业”之后终于能出来面试找机会了。不管哪一种,有个问题必须要再次审视了——算法面试!如果想去好点的公司或者高薪的岗位,现场算法几乎是绕不开的问题。很多人平时感觉自己还挺聪明的,一到算法就智商归零, 该咋办呢?
2023-02-09 07:34:05
2544
1
原创 一文搞定垃圾回收的三色标记法
我们之前介绍了各种常见垃圾回收器的基本原理,本小节我们讨论一个更深入的问题——垃圾回收器的底层是如何做的。在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。这就好比你在拖地,但是你的孩子却在跑来跑去,结果你一直拖不干净。主流的垃圾收集器基本上都是基于可达性分析算法来判定对象是否存活的,也就是”三色标记法“。根据对象是否被垃圾收集器扫描过而用白、灰、黑三种颜色来标记对象的状态的一种方法。而其中白色:表示对象尚未被垃圾收集器访问过。
2023-01-01 10:06:28
737
原创 一文搞懂G1垃圾回收器
G1是从JDK9之后的默认垃圾回收器,其功能强大,性能优异,不过目前市面的材料不算多,很多都是抄来抄去,讲得也不太清楚。经过仔细阅读oracle官网以及相关的材料,从整体上梳理了G1的过程,希望这一文能帮你真正搞懂G1垃圾回收器。
2022-12-31 18:13:52
1783
2
原创 携程Apollo配置中心架构介绍
Apollo(阿波罗)是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,可以说Apollo是目前配置中心产品领域Number1的产品,其成熟度和企业级特性要远远强于Spring Cloud体系中的Spring Cloud Config产品。
2022-12-19 11:32:42
2329
原创 opcj3—人人开源三大套件的简单用法
renren开源是一个很不错的开源开发组件,其中目前对我们最有用的有三个:renren-fast、renren-fast-vue和renren-generator。renren-generator是核心服务,可以根据数据库自动生成从controller层到service层,再到持久层的Java代码。renren-fast-vue是与之配套的前端页面,两者可以完整的实现一个前后端分离的小型管理系统。
2022-12-08 17:09:58
621
原创 opcj2-盘点几个常见的Java开源脚手架
很多人抱怨自己是CURDer,很多时候就是在简单的修修改改。如果不书序SSM(Spring、SpringMVC和Mybatis)套路的人可能开始的时候会感觉非常吃力。但是熟悉之后发现其实就这么回事。SpringMVC负责响应对外接口,Mybatis负责数据库的访问,Spring则负责整体的bean管理,目前一般都使用SpringBoot做进一步的封装。不管多么复杂的业务,基本结构都是这样子。
2022-12-08 15:40:42
2196
原创 opcj1——mac下如何快速搭建Java开发环境
这是我们OPCJ的第一篇,搭建基础的开发环境。我们的服务会不断增加新组件,我们这里先介绍如何快速搭建开发环境。一般来说Java程序员的电脑上总是会有一些已经配置好的idea、git、maven或者其他的,Docker是一个虚拟化容器技术,Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行环境,容器之间相互隔离。先启动docker桌面端,然后执行如下命令:拉取最新的镜像然后用该镜像创建mysql实例,使用下面的命令来创建:这里对上面的参数做下简单的介绍,如果不想了解这一块直接
2022-12-08 00:03:52
692
原创 盘点面试常见的设计类算法问题
设计问题也是一种很重要的考察类型,特征是整体难度不大,但是要求结构合理、复用性好、考虑周全,代码规范等等。有些面试官不喜欢烧脑的动态规划等问题,就喜欢设计题,笔者曾经在面试微博和猿辅导都遇到过类似的问题。这些题目中最重要的是LRU设计,我们前面应重点讲解。LeetCode里还有大量的设计类型的问题,这些题目整体来说难度都不大,但是要完整写完要花费很多篇幅,感兴趣的同学可以看这里加强练习。本文我们盘点几道典型的设计问题。
2022-11-24 22:29:01
527
原创 青岛的屌丝如何逆袭到微博的高级架构师的
4.与大厂相比 ,上升期的公司更容易进,2012年前后微博正是上升期,大量招人,他说当时还有CEO面,这个CEO现在仍然是微博的CEO,这说明当时微博刚从新浪分离出来 ,人还不多。我在微博时的老大,据说是从青岛的普通本科起步的,2013年到了北京就入职了微博,之后一直干到高级架构师、技术专家,现在一直负责微博的某个核心业务。HR大部分不懂技术,只会根据学历、参与的项目、比赛获奖这些来筛选,因此必须通过专门联系技术等方式让自己拥有更多的机会。每个人的经历不同,但是一定要从自己的经历中打造出亮点。
2022-11-24 17:13:00
113
原创 盘点面试中常见的超大规模数据场景算法问题
在大部分算法题目中,默认给定的数据量都很小的,例如只有几个或者十几个元素,但是如果将数据量提高到百万甚至十几亿,那处理逻辑就会发生很大差异,这也是算法考查中,经常出现的一类问题。此时普通的数组、链表、Hash、树等等结构有无效了 ,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,必须另外想办法。这类问题该如何下手呢?这里介绍三种非常典型的思路:1.使用位存储,使用位存储最大的好处是占用的空间是简单存整数的1/8。
2022-11-12 13:03:24
826
原创 海量数据场景下的算法问题:透彻理解从40个亿中产生一个不存在的整数
在大部分算法中,默认给定的数据量都很小的,例如只有几个或者十几个元素,但是如果将数据量提高到百万甚至十几亿,那处理逻辑就会发生很大差异,这也是算法考查中,经常出现的一类问题。此时普通的数组、链表、Hash、树等等结构有无效了 ,而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,必须另外想办法。这类问题该如何下手呢?位运算以及相关拓展用法可以解决一部分场景的问题,本文就分析一个最热门的问题之一:从40个亿中产生一个不存在的整数。
2022-11-11 09:01:23
336
原创 Java使用Excel的问题:自动跳过空字段、中文加拼音和时间处理错误的解决方法
在Java中解析Excel是很多管理类系统的重要功能, 目前主要有阿里的easyExcel和HSSF两种开源工具,如何使用网上有大量的例子,不再赘述,我们这里看三个我亲身经历的问题:自动跳过空字段中文内容自动给加了拼音时间处理错误。本文首先分析故障现象或者原因,之后给出解决方案。
2022-11-08 19:46:06
3928
原创 谈谈Java对象的生命周期
经过前面的分析 ,我们现在来看一下创建的对象到底是什么东西,并且完整的总结一下一个对象从创建到回收到底经过了哪些阶段。
2022-10-30 16:07:59
600
原创 JVM的堆工作过程原来就是收拾房间
当Eden的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对Eden区进行垃圾回收(MinorGC),Eden区中不再被其他对象引用的对象就是要被清理的,但是此时仍然有仍然在使用的,此时会将活的对象整理都移动到Survivor0区,之后Eden区就完全清空,可以继续存放新的对象了。另外,虽然不同对象的周期不同,但是70%-99%的对象是临时对象,也就是很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。
2022-10-30 15:01:35
215
原创 一文理解JVM的方法区
常量池可以看做是一张表,常量池内部的内容比较多,例如数量值、字符串值、类引用、字段引用、方法引用等等,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。域的相关信息包括:域名称,域类型,域修饰符例如public,private,protected,static,final,volatile,transient等等。方法的修饰符(public,private,protected,static,final,synchronized,native,abstract的一个子集)
2022-10-30 11:41:29
235
1
原创 一文理解虚拟机栈
在JVM中,将符号转换为调用方法的直接引用与方法的绑定机制相关。绑定时参考的一个重要信息来源就是常量池,根据常量池的信息将这些内容转换为实际的地址。//一个方法对应一块栈帧内存区域int a = 1;int b = 2;return c;}}}我们通过javap -v Math.class 查看其字节码中main()方法的内容根据上图的信息我们可以推断出,new对应的就是new Math()
2022-10-30 11:29:13
520
原创 一文理解JVM的程序计数器(PC)
本文我们将介绍PC计数器是如何工作的,如何表示跳转和循环等操作的,以及线程安全相关的问题。JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的信息。CPU只有把数据装载到寄存器才能够运行。但是这里并非是广义上所指的物理寄存器,在JVM中只是对PC寄存器的一种模拟,用来处理当前线程相关指令的计数器。有一点与CPU的寄存器是类似的,那就是占用空间小,但运行速度最快。
2022-10-30 11:10:41
1098
原创 从源码理解双亲委派机制,原来如此简单
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式。简单来说,双亲委派机制,就是app加载器先向上交由父类加载器进行加载,父类中找不到,再由子类加载器自行加载。具体来说:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
2022-10-26 20:12:39
541
原创 从源码透彻理解JVM类加载机制
接下来,我们就逐个介绍一下几种类加载器。第一种:启动类加载器启动类加载器(引导类加载器,Bootstrap ClassLoader)这个类加载使用C/C++语言实现的,嵌套在JVM内部它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类万物之祖,不继承其他类,没有父加载器加载扩展类和应用程序类加载器,并作为他们的父类加载器。
2022-10-26 20:02:54
487
原创 一文理解JVM的类加载系统
}该类是如何一步步被加载的呢?加载的过程如下所示:第一步:加载阶段,字节码文件会以文件流的形式输入,JVM会读取并加载这些字节码文件。第二步:链接阶段,对字节码进行验证、初步的处理,并将常量池内的符号引用转换为直接引用等等。第三步:初始化阶段,这一阶段主要是创建对象了。每个阶段又有更具体的功能,如下图所示:接下来,我们先介绍每个组件的功能,然后再从源码等角度来看整个系统是如何工作的。
2022-10-26 19:53:38
319
原创 爆肝一周——PYTHON 算法基础
我们之前声明了 Python 是一种面向对象的编程语言,到目前为止我们已经用了很多内置的类来说明数据和控制的构成。但是,面向对象的编程语言一个最重要的特征是允许编程者(解决问题的人)来创造一个可以用来解决问题的数据模型的新的类。记住我们运用抽象的数据类型来提供一个关于某种数据项目是什么样子(它的阐述)和它能做什么(它的方法)逻辑描述。通过建立类来实现一种抽象数据类型,一个编程者可以从中获得抽象过程的好处同时也提供必须的细节来将这些抽象实际运用到一个程序中。
2022-10-15 23:57:35
606
原创 python进阶指南(参考书籍)
网上看到有个人总结了python进阶教程,这里做个记录吧。不过,先说再前面,精读1本书胜于泛读10本,因此要选对书,然后认真读,细细读。
2022-10-12 22:30:39
110
原创 C/C++ 算法基础
我们以简单程序Hello World为例说明程序的基本框架。此程序在屏幕上输出一行“Hello World!}这段程序包括二个部分:1.#include #include是C语言的保留字,表示要把另一个文件中的内容包含在本文件中。是被包含的文件的文件名。C语言中提供了一些可以被直接拿来使用、能够完成某些特定功能的库函数,分别声明于不同的头文件中。例如:stdio.h中定义了一些与输入输出有关的函数。
2022-10-07 16:39:06
8294
2
原创 Zookeeper3:状态管理简介
在应用程序中,很多时候需要知道ZooKeeper集合的状态。例如,备份主节点需要知道主要主节点已经崩溃,从节点需要知道任务分配给了自己,甚至ZooKeeper的客户端会定时轮询ZooKeeper集合,检查系统状态是否发生了变化。然而轮询方式并非高效的方式,尤其是在期望的变化发生频率很低时。例如,在主要主节点崩溃时,备份主节点需要知道这一情况, 以便它们可以进行故障处理。为了减少主节点崩溃后的恢复时间,我们需要频繁轮询,如每50毫秒,那每秒就产生20次查询。
2022-10-05 22:44:27
793
原创 Zookeeper2.基于zk的开发入门
只通过命令玩zk是不够的,我们需要将其集成到业务代码里,很多公司会将zk的相关操作封装到一个公共的包中,不必每个服务都自己写一套。现在我们看一下如何基于zk进行二次开发。
2022-10-01 08:31:14
936
原创 Zookeeper1:相关理论
zookeeper是为了在分布式环境下,让开发人员可以实现通用的协作任务,包括选举主节点、管理组内成员关系、管理元数据等。在大数据和云计算盛行的今天,应用服务由很多个独立的程序组成,这些独立的程序则运行在形形色色、千变万化的一组计算机上。相对于开发在一台计算机上运行的单个程序,如何让一个应用中多个独立的程序协同工作是一件非常困难的事情。开发这样的应用,很容易让很多开发人员陷入如何使多个程序协同工作的逻辑中,最后导致没有时间更好地思考和实现他们自己的应用程序逻辑,又或者开发人员对协同逻辑关注不够,只是
2022-10-01 08:04:51
967
原创 解决springboot2.6和swagger冲突的四种方法
最近要将后台服务从SpringBoot1升级到2版本,主要目的是为了使用SpringBoot2的实时监控功能。集成的时候无法启动,根据日志判断与swagger有关。查了半天,一个解释是springboot修改了请求路由匹配策略,Spring MVC 处理程序映射匹配请求路径的默认策略已从 AntPathMatcher 更改为PathPatternParser。Actuator端点现在也使用基于 PathPattern 的 URL 匹配,因此Actuator端点的路径匹配策略无法通过配置属性进行配置。
2022-09-28 16:21:16
4723
原创 终于肝了30篇高并发-学习贵在坚持
到今天为止终于将多线程给过了一遍,在发第一篇之前,已经花了比较多的时间做笔记,最近只是将笔记重新分析了一遍,然后拆分成合适的文章逐步完善和发布。高并发与多线程是个非常广阔的大海,而且很多内容学习难度还挺大。这30篇不过是冰山一角。现在就找到了十几个可以继续研究和发表的主题。不过我能暂且告一段落,先学习其他技术,后面再来梳理。
2022-09-26 15:37:04
218
原创 30.盘点各种各样的锁
作为本系列的最后一篇,我们今天来盘点一下前面这些章节中涉及的锁:作为高并发的核心主题之一,各种各样的锁伴随我们整个课程 ,现在我们就来梳理一下到底有多少种锁。需要注意的是,这些锁不是简单的包含与被包含的关系,也不是并列关系,而是从不同的角度看就有不同类型的锁。
2022-09-26 15:12:09
458
原创 29.安全集合
}}}那ConcurrentHashMap是如何实现线程安全的呢?其机制在JDK7和8中有所不用。JDK1.7中 将一个大的HashMap分成16个segetment,每个segement其实就是一个Hashtable。如果出现冲突会采用线性方式连接。而JDK1.8中取消了segemnt,加锁粒度更小,如下图所示:如果当单个节点的元素比较多时会该节点对应的链改造成红黑树结构。
2022-09-26 11:40:05
254
原创 28.线程池
前面介绍的线程池体系其实都属于Java5之后引入的Executor框架。所谓Executor框架,是并发编程中引入的一些线程启动、调度、管理的API,通过这个框架可以很好地分离线程的工作任务和线程的执行过程 ,以及简化线程的基本操作。从图中可以看到,ThreadPoolExecutor线程池实现了Executor和ExecutorService接口,下面简单说一下各个接口和类的含义。
2022-09-26 10:45:44
171
原创 27.阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是 从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。在阻塞队列不可用时,这两个附加操作提供了4种处理方式,如表所示。
2022-09-25 16:02:26
321
原创 26.原子类操作类
JDK1.5之前,为了保证Java中对单个变量的多个独立操作的原子性和安全性,通常会使用到synchronized锁,但是synchronized需要底层操作系统mutex资源的支持,这是一种重量级资源,性能比较低!JDK1.5的时候,新增了JUC包,增加了许多和同步有关的特性,大大提高了使用Java进行并发编程的效率,比如并发集合、并发队列、新lock锁等。
2022-09-25 15:47:33
221
原创 25.CyclicBarrire的功能和作用
CyclicBarrire的意思是可循环(Cyclic)使用的屏障Barrire,主要作用是让一组线程达到一个屏障(也可以称为同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才能继续往下执行,线性进入屏障通过CyclicBarrire的await()方法实现的。
2022-09-19 22:59:00
222
原创 24.Semaphore的作用和原理
Semaphore就是信号灯的意思,主要功能是用来限制对某个资源同时访问的线性数量,它有两个核心方法:acquire()方法,获取一个令牌。release()方法,释放一个令牌。如下图所示,当多个线程访问某个限制访问流量的资源时,需要先调用acquire()方法获得一个访问令牌,如果能正常获得,则表示允许访问,如果令牌不够,则会阻塞当前线程。
2022-09-19 22:53:50
464
原创 23.CountDownLatch的应用和原理
我们先看一下如何使用CountDownLatch。上面的代码构建了一个倒计时为2的countDownLatch实例。定义两个线程分别执行RelationService线程,在线程中调用countDownLatch.countDown()方法,表示对倒计时进行递减,其实也可以认为当前线程的某个任务执行完毕。最后在main()方法中调用countDownLatch.await()进行阻塞,当计数器为0时被唤醒。该类的使用类似Thread.join(),但是比其更加灵活。
2022-09-19 22:48:13
224
原创 22.Condition的功能和原理
前面我们比较完整的介绍了重入锁的原理和实现过程,本开始,我们梳理几个的比较重要的并发工具:Condition、CountDownLatch、Semaphone、CyclicBarrier和原子类。本章我们先看Condition。Condition在业务代码中使用的并不算多,但是在很多开源框架的源码中有大量应用。它的作用和wait()/notify()方法相同,都是基于某个条件去等待和唤醒,所以可以认为两者作用基本一致。
2022-09-19 22:34:57
543
原创 22.读写锁ReetrantReadWriteLock
我们接下来从整体上看一下读写锁的基本过程。假设两个线程ThreadA和ThreadB先去获得读锁。此时使用firstReader和firstReaderHoldCount分别记录第一个获得读锁的线程以及线程重入的次数。ThreadB获得读锁,用HoldCounter记录当前线程的重入次数。接着ThreadC来抢占写锁,由于此时有ThreadA和ThreadB持有读锁,因此ThreadC抢占写锁失败,直接加到同步阻塞队列中。此时假如又来了D和E来抢占写线程。
2022-09-18 23:12:13
178
mysql-connector-c++-8.0.23-macos10.15-x86-64bit.dmg
2021-05-10
live555.chm帮助文档
2016-09-09
QtFtp源代码
2016-07-19
qt5使用curl实现文件下载的示例程序
2016-06-20
64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver
2016-02-02
ffmpeg-2.0.tar.bz2 linux源代码
2014-05-02
vlc -1.1.7.tar.bz2 linux版源代码
2014-05-02
深度学习基础教程
2014-04-10
Geoffrey Hinton 深度学习 培训材料
2014-04-10
Handbook of Face Recognition 李子青-人脸识别技术
2014-04-10
为什么java中使用移位会出错
2022-01-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人