首页 文章 精选 留言 我的

精选列表

搜索[业务线],共10000篇文章
优秀的个人博客,低调大师

吃透这份pdf,面试阿里、腾讯、百度等一线大厂,顺利拿下心仪offer!

前言 最近一位年前裸辞的朋友来找我诉苦,说因为疫情原因现在都在家吃老本。本想着年后就来找工作的,但是现在这个情况也不好找,而且很多公司也随着这次疫情面临着资金紧缺导致裁员严重的甚至倒闭,导致很多人失业找不到工作,就更加竞争压力大了朋友说自己实力不过关,很多面试题都答不上,问我有没有之前的面试总结,于是我给了他这份(核心知识点)还有一些面试题总结。现在他拿到了offer,我觉着这个文档对大家应该也有帮助,现在分享给大家!这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等,以下是文档内容的展示! JVM相关 1.线程2.JVM内存区域2.1程序计数器2.2虚拟机栈2.3本地方法栈2.4堆2.5方法区3.JVM运行时内存3.1新生代3.2老年代3.3永久代4.垃圾回收与算法4.1如何确定垃圾4.2标记清除算法4.3复制算法4.4标记整理算法4.5分代收集算法5.Java的4中引用类型5.1强引用5.2软引用5.3弱引用5.4虚引用 6.GC分代收集算法VS分区收集算法6.1分代收集算法6.2分区收集算法7.GC垃圾收集器7.1serial垃圾收集器7.2parnew垃圾收集器7.3parallel scavenge收集器7.4serial old收集器7.5parallel old收集器7.6CMS收集器8.Java IO/NIO8.1阻塞IO模型8.2非阻塞IO模型8.3多路复用IO模型8.4新号驱动IO模型8.5异步IO模型8.6java IO包8.7java NIO9.JVM类加载机制9.1加载9.2验证9.3准备9.4解析9.5符号引用9.6直接引用9.7类构造器9.8双亲委派9.9OSGI 多线程并发相关 1.Java并发知识库2.Java线程实现/创建方式2.1继承thread类2.2实现runnable接口2.3基于线程池的方式3.线程生命周期(状态)3.1新建状态3.2就绪状态3.3运行状态3.4阻塞状态3.5线程死亡4.终止线程的4种方式4.1正常运行结束4.2使用退出标记退出线程4.3interrupt方法结束线程4.4stop方法终止线程 5.sleep与wait区别6.start与run区别7.Java后台线程8.Java锁8.1乐观锁8.2悲观锁8.3自旋锁8.4synchronize同步锁8.5可重入锁(递归锁)8.6公平锁与非公平锁8.7共享锁与独占锁8.8重量级锁8.9轻量级锁9.Java线程基本方法9.1线程等待9.2线程睡眠9.3线程让步9.4线程中断9.5线程唤醒 10.线程上下文切换10.1进程10.2上下文10.3寄存器10.4程序计数器10.5PCB“切换锁”11.同步锁与死锁11.1同步锁11.2死锁12.线程池原理12.1线程复用12.2线程池的组成12.3拒绝策略13.Java阻塞队列原理13.1阻塞队列的主要方法13.1java中的阻塞队列。欢迎关注我的公种浩:程序员追风,回复66 领取这份pdf资料。 14.volatile关键字的作用(可见性、有序性、原子性)14.1变量可见性14.2进制重排序14.3适用场景15.Java中用到的线程调度16.进程调度算法16.1有限调度算法16.2高优先权先调度算法16.3基于时间片的轮转调度算法17.什么是CAS(比较并交换-乐观锁机制-锁自旋)17.1概念及特性17.2原子包17.3ABA问题18.什么是AQS(抽象的队列同步器)18.1exclusive独占锁资源18.2share共享资源18.3同步器的实现是ABA核心18.4reentrantreadwritelock实现独占锁和共享两种方式 Spring相关 1.Spring特点1.1轻量级1.2控制反转1.3面向切面1.4容器1.5框架集合2.Spring核心组件3.Spring常用模块4.Spring主要包5.Spring常用注解6.Spring的第三方结合7.Spring IOC原理7.1概念7.2spring容器高层识图7.3IOC容器实现8.Spring Bean生命周期8.1实例化8.2IOC依赖注入8.3setbeanname实现8.4beanfactoryaware实现8.5destroy过期自动清理阶段8.6destroy-method自配置清理9.Spring AOP原理9.1概念9.2AOP核心概念9.3AOP两种代理方式 10.Spring boot原理10.1创建独立的spring应用程序10.2嵌入的Tomcat无需部署WAR文件10.3简化maven配置10.4自动配置spring11.JPA原理11.1事务11.2本地事务11.3分布式事务11.4两阶段提交12.mybatis缓存12.1mybatis的一级缓存原理12.2二级缓存原理13.Tomcat架构 微服务相关 1.服务注册发现1.1客户端注册1.2第三方注册1.3客户端发现1.4服务端发现2.API网关2.1请求转发2.2相应合并2.3协议转换2.4数据转换2.5安全认证3.配置中心3.1zookeeper配置中心3.2配置中心数据分类4.事件调度(kafka)5.服务跟踪(starter-sleuth)6.服务熔(hystrix)7.API管理 数据库相关 1.储存引擎1.1概念1.2B+树1.3tokudb1.4mylasm1.5memory2.索引2.1常见索引原理2.2限制索引的数目3.数据库的三范式3.1第一范式3.2第二范式3.3第三范式4.存储过程5.触发器6.数据库并发策略6.1乐观锁6.2悲观锁6.3时间戳 7.数据库锁7.1行级锁7.2表级锁7.3页级锁8.基于Redis分布式锁9.两阶段提交协议9.1准备阶段9.2提交阶段9.3缺点10三阶段提交协议10.1cancommit阶段10.2precommit阶段10.3docommit阶段11.CAP11.1一致性11.2可用性11.3分区容忍性 内容太多就不一一展示了,需要资料欢迎关注我的公种浩:程序员追风,回复66 领取这份pdf资料。! 最后 祝大家工作顺利,升职加薪,面试都能通过,offer拿到手软,早日找到心仪的工作~

优秀的个人博客,低调大师

如果你不了解Java的JVM,那真的很难进BAT一线大厂!

前言 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。 思考一下 学习一项知识总该知道为什么学习吧。有人会说,这些写代码好像又用不上,貌似所有的事情JVM都替我们做好了。那就,思考一下为什么要学习JVM虚拟机结构。那你是否遇到这样的困惑:堆内存该设置多大?OutOfMemoryError异常到底是怎么引起的?如何进行JVM调优?JVM的垃圾回收是如何?甚至创建一个String对象,JVM都做了些什么?这些疑问随着学习的深入都会慢慢得到解答,而要解决这些问题的第一步,就是先了解JVM的构成。 JVM内存结构 java虚拟机在执行程序的过程中会将内存划分为不同的数据区域,看一下下图。 如果理解了上图,JVM的内存结构基本上掌握了一半。通过上图我们可以看到什么?外行看热闹,内行看门道。从图中可以得到如下信息。第一,JVM分为五个区域:虚拟机栈、本地方法栈、方法区、堆、程序计数器。PS:大家不要排斥英语,此处用英文记忆反而更容易理解。第二,JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有,方法区和堆为线程共享区。图中已经用颜色区分,绿色表示“通行”,橘黄色表示停一停(需等待)。第三,JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小。那么最大的区域会放什么?当然就是Java中最多的“对象”了。学习延伸:如果你记住了这张图,是不是就可以说出关于JVM的内存结构了呢?可以尝试一下,切记不用死记硬背,发挥你的想象。 堆(Heap) 上面已经得出结论,堆内存最大,堆是被线程共享,堆的目的就是存放对象。几乎所有的对象实例都在此分配。当然,随着优化技术的更新,某些数据也会被放在栈上等。枪打出头鸟,树大招风。因为堆占用内存空间最大,堆也是Java垃圾回收的主要区域(重点对象),因此也称作“GC堆”(Garbage Collected Heap)。关于GC的操作,我们后面章节会详细讲,但正因为GC的存在,而现代收集器基本都采用分代收集算法,堆又被细化了。 同样,对上图呈现内容汇总分析。第一,堆的GC操作采用分代收集算法。第二,堆区分了新生代和老年代;第三,新生代又分为:Eden空间、From Survivor(S0)空间、To Survivor(S1)空间。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。也就是说堆的内存是一块块拼凑起来的。要增加堆空间时,往上“拼凑”(可扩展性)即可,但当堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。 方法区(Method Area) 方法区与堆有很多共性:线程共享、内存不连续、可扩展、可垃圾回收,同样当无法再扩展时会抛出OutOfMemoryError异常。正因为如此相像,Java虚拟机规范把方法区描述为堆的一个逻辑部分,但目前实际上是与Java堆分开的(Non-Heap)。方法区个性化的是,它存储的是已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是回收确实是有必要的。 程序计数器(Program Counter Register) 关于程序计数器我们已经得知:占用内存较小,现成私有。它是唯一没有OutOfMemoryError异常的区域。程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变计数器的值来选取下一条字节码指令。其中,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成。 Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。 因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。 虚拟机栈(JVM Stacks) 虚拟机栈线程私有,生命周期与线程相同。栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。 局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量。包括8种基本数据类型、对象引用(reference类型)和returnAddress类型(指向一条字节码指令的地址)。其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈动态扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。操作数栈(Operand Stack)也称作操作栈,是一个后入先出栈(LIFO)。随着方法执行和字节码指令的执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中元素出栈到局部变量表或者返回给方法调用者,也就是出栈/入栈操作。动态链接:Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态链接(Dynamic Linking)。方法返回:无论方法是否正常完成,都需要返回到方法被调用的位置,程序才能继续进行。 本地方法栈(Native Method Stacks) 本地方法栈(Native Method Stacks)与虚拟机栈作用相似,也会抛出StackOverflowError和OutOfMemoryError异常。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。区别在于虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈是为虚拟机使用到的Native方法服务。 总结 经过上面的讲解,想必大家已经了解到JVM内存结构的基本情况。下面对照脑图,归纳总结一下,看你能说出来多少。 最后欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

优秀的个人博客,低调大师

一线大厂面试必问的!

什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 标记 垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。 清除 这一步会删掉标记出的未引用对象。 内存分配器会保留指向可用内存的引用,以供分配新对象。 压缩 为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。 为什么需要分代垃圾收集? 之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间) 上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。 JVM 分代 根据之前的规律,就可以用来提升 JVM 的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。 新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。在这种事件发生时,所有的程序线程都要暂停,直到事件完成(比如这里就是完成了所有回收工作)为止。老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。最终老年代也会被回收。这个事件成为 Major GC。Major GC 也会触发STW(Stop the World)。通常,Major GC会慢很多,因为它涉及到所有存活对象。所以,对于响应性的应用程序,应该尽量避免Major GC。还要注意,Major GC的STW的时长受年老代垃圾回收器类型的影响。永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外,Java SE类库和方法也存储在这里。如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。 世代垃圾收集过程 现在你已经理解了为什么堆被分成不同的代,现在是时候看看这些空间是如何相互作用的。后面的图片将介绍JVM中的对象分配和老化过程。首先,将任何新对象分配给 eden 空间。两个 survivor 空间都是空的。 当 eden 空间填满时,会触发轻微的垃圾收集。 引用的对象被移动到第一个 survivor 空间。清除 eden 空间时,将删除未引用的对象。 在下一次Minor GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们被移动到了第二个Survivor区(S1)。此外,第一个Survivor区(S0)中,在上一次Minor GC幸存的对象,会增加年龄,并被移动到S1中。待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。 在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0,。幸存的对象增加年龄。Eden区和S1被清空。 此幻灯片演示了 promotion。在较小的GC之后,当老化的物体达到一定的年龄阈值(在该示例中为8)时,它们从年轻一代晋升到老一代。 随着较小的GC持续发生,物体将继续被推广到老一代空间。 所以这几乎涵盖了年轻一代的整个过程。最终,将主要对老一代进行GC,清理并最终压缩该空间。 最后 欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!

优秀的个人博客,低调大师

python是如何利用多线进程优化视频应用到的? 原来是这样的

前言如果要用Python播放视频,或者打开摄像头获取视频流,我们可以用OpenCV Python。但是在视频帧获取的时候同时做一些图像识别和处理,可能会因为耗时多而导致卡顿。一般来说,我们首先会想到把这些工作放入到线程中处理。但是由于Python GIL的存在,用不用线程几乎没有区别。所以要解决这个问题,必须通过多进程。这里分享下使用Dynamsoft Barcode Reader开发Python条形码扫码的例子。 学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习python或者有兴趣学习python的伙伴可以私信回复小编“学习”或者评论,留言,点赞 领取全套免费python学习资料、视频()装包 用Python和摄像头打造的桌面条形码扫码应用 安装Dynamsoft Barcode Reader: pip install dbr 安装OpenCV Python pip install opencv-python 在主程序中创建一个新的扫码进程和共享内存: from multiprocessing import Process, Queue frame_queue = Queue(4) finish_queue = Queue(1) dbr_proc = Process(target=dbr_run, args=( frame_queue, finish_queue)) dbr_proc.start() 通过OpenCV不断获取视频帧插入到队列中: vc = cv2.VideoCapture(0) if vc.isOpened(): # try to get the first frame rval, frame = vc.read() else: return windowName = "Barcode Reader" base = 2 count = 0 while True: cv2.imshow(windowName, frame) rval, frame = vc.read() count %= base if count == 0: try: frame_queue.put_nowait(frame) except: try: while True: frame_queue.get_nowait() except: pass count += 1 条形码读取进程不断从队列中拿出数据进行解码: def dbr_run(frame_queue, finish_queue): dbr.initLicense(config.license) while finish_queue.qsize() == 0: try: inputframe = frame_queue.get_nowait() results = dbr.decodeBuffer(inputframe, config.barcodeTypes) if (len(results) > 0): print(get_time()) print("Total count: " + str(len(results))) for result in results: print("Type: " + result[0]) print("Value: " + result[1] + "\n") except: pass dbr.destroy()

优秀的个人博客,低调大师

中国媒体上马了一条神奇的视频生产线

8个展区展览面积总计约30万平方米,来自130多个国家和地区的企业参展……进博会,好大的“新闻富矿”!可是,好些媒体记者却表示脑阔有点疼——两只眼睛一双手,又要写文字、又要拍视频,忙不过来呀! 不用愁!因为我们有“现场云”和“媒体大脑MAGIC”。 截至6日下午,新华社联合13家参加进博会报道的媒体,运用“现场云”移动采编平台——用手机边走边拍边发——不到两天时间就发185条短视频、12场视频直播。 更奇妙的是,“媒体大脑MAGIC”运用人工智能技术对这些视频进行再加工——通过对视频画面逐帧拆解和再组合——又生(bian)产(huan)出230条全新的视频。不仅有中文的,更有英文、日文、葡文报道呈上。 秒级生成、海量生产、受众喜欢,MAGIC+现场云是如何做到的呢? 简单!总共分三步: 第一步,前方记者基于现场云实时采集视频素材,即拍即传,完

优秀的个人博客,低调大师

一线开发者这样说

Google IO 2017 宣布了 Kotlin 会成为 Android 官方开发语言。一时间朋友圈和 Android 圈被各种刷屏。当然我也顺势而为发布了一篇的文章《为什么我要改用Kotlin》,着实狠狠地蹭了一波热度(尽管这样会被鄙视)。眼下 Android 圈已经躁动了,甚至严重到如果对 Kotlin 视而不见就显得自己不像一个合格的 Android 程序员。 本文尝试从一个客观全面一点儿的角度来看待这件事情,尽力为大家提供一个比较理性的观点供参考。 为什么会选用Kotlin 关于 Google 为什么会选择 Kotlin,我认为有两方面的原因。 ● 为了逐渐摆脱专利流氓Oracle。从去年的转向OpenJDK,到现在的支持Kotlin作为官方语言,某种意义是为了摆脱藉由9行代码敲诈获取天价赔偿的Oracle。 ● 选用Kotl

优秀的个人博客,低调大师

解读阿里AIR计划:14个研究领域29个行业一线问题等你来战!

雷锋网AI科技评论按:7月18日,阿里巴巴集团的技术社交账号「阿里技术」对外公布,阿里AIR计划启动。该计划也是阿里发布NASA计划以来,为探索科技创新设立的首个全球性科研项目,目的是聚焦技术,驱动未来。 “AIR计划”的AIR在这里并不是“空气”的意思,是「 Alibaba Innovative Research」的缩写。中文意思是阿里巴巴创新研究计划。雷锋网(公众号:雷锋网)了解到,此项计划正在邀请全球学术机构和非营利性科研机构的学者参与进来。国内已有多家高校学术研究机构收到邀请函,比如哈尔滨工业大学,南京大学科技处,山东大学微电子学院等等。 哈尔滨工业大学科工院科技开发部收到的邀请函 南京大学科技处收到的邀请函 雷锋网编辑登录阿里AIR官方网站,首页是这样介绍“AIR计划”的: 阿里巴巴创新研究(AIR)计划是阿里巴巴集团发起的旨在探

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册