- 博客(42)
- 收藏
- 关注

原创 美团面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制
把所有的引用关系看作是一张图,从一个节点GC ROOT(线程栈的本地变量、静态变量、本地方法栈的变量等等)开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后。剩余的节点则被认为是没有被引用到的节点,既可以当作垃圾。在我们的ThreadLocal类有一个静态内部类,叫做ThreadLocalMap,用键值对的形式存储每一个线程的变量副本,ThreadLocalMap中元素的key为当前ThreadLocal对象,而value对应线程的变量副本。
2024-05-16 16:05:59
1201
原创 JAVA理论第十四章-Nginx
此时,客户端就可以向nginx发起连接了。,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力。服务器,及电子邮件代理服务器,同时也是一个非常高效的。首先,nginx在启动时,会解析配置文件,得到。,与nginx建立好一个连接后,此时,某一个。,如http模块与客户端进行数据的交换。,此时代理服务器对外就表现为一个。给internet上请求连接的。给各服务器中,负载均衡主要解决。,到此,一个连接就寿终正寝了。,为了从原始服务器取得内容,,提供了一个队列,排队解决。,然后在nginx的。
2025-06-12 09:38:59
82
原创 JAVA理论第十三章-Redis
当其他主节点ping一个主节点A时,它的底层主要是先去初始化一个比较大的数据,里面存放的是二进制0或1.在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的小标,然后将数组中的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找过程也是一样的。缺点是布隆过滤器有可能产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实是很划算的了,5%以内的误判率一般的项目也能接收,不至于高并发下压倒数据库。
2025-06-12 09:00:00
605
原创 JAVA理论第3.5章-多线程与锁
Java多线程与并发编程总结 线程通信:notify()随机唤醒一个等待线程,notifyAll()唤醒所有等待线程。wait()释放锁并进入等待,需外部唤醒;sleep()不释放锁,时间到自动唤醒。 锁机制: synchronized:基于Monitor实现,含偏向锁、轻量级锁(CAS)、重量级锁三级升级,保证原子性但性能受限。 ReentrantLock:基于AQS实现,支持公平/非公平锁、可中断、超时等特性,需手动释放锁。 线程安全: CAS:乐观锁思想,通过Unsafe类调用底层指令。 volati
2025-06-11 14:47:55
1015
原创 JAVA理论第十二章-SpringCloud
目前微服务微服务架构主流的是 SpringBoot+Dubbo 和 SpringBoot+SpringCloud81的架构模式. 综上, 无论是 SOA 还是微服务, 都需要进行服务调度, 目前主流的服务调度室RPC和HTTP 两种协议, 而 Dubbo 基于 RPC 的远程调度机构, SpringCloud 是基于Rest 风格(基于 http 协议实现的)的 Spring 全家桶微服务服务治理框架. 说到这里也可以继续说下Dubbo 和 SpringCloud 的区别。SOA:面向服务的架构。
2025-06-11 09:15:00
743
原创 JAVA理论第十一章-SpringBoot
进行自动配置,如:添加了spring-boot-starer-web依赖,会自动添加Tomcat和SpringMVC的依赖,SpringBoot会对Tomcat和SpringMVC进行自动配置。的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发效率,一定程度上缩短了项目周期。,并且尽可能的减少一切 xml 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。:解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置。
2025-06-11 09:00:00
1030
原创 JAVA理论第十章-SpringMVC 框架
SpringMVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级Web框架,通过把model,view,controller分离,将web层进行职责解耦,把复杂web应用拆分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。在我看来,SpringMVC就是将我们原来开发在servlet中代码拆分了,一部分有mvc完成,一部分由自己完成。,它的实现类支持不同的视图类型,如jsp,free marker,pdf等等。接口),并实现里面的异常处理方法,然后将。
2025-06-10 09:30:00
915
原创 JAVA理论第九章-Spring框架
这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。spring的配置文件中配置了类的字节码位置及信息,容器生成的时候加载配置文件识别字节码信息,通过反射创建类的对象。也可以放在方法上:表示自动执行当前方法,如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值。中,(key是bean的名字,value是bean的信息,包括全限定名等等),没有数据库的事务支持,spring是无法提供事务功能。
2025-06-10 09:00:00
582
原创 JAVA理论第八章-Mybatis框架
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和java的POJO为数据库中的记录。,resultMap要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来。需要在setting全局参数中配置二级缓存,如下conf.xml配置。mybatis在处理${}时,就是把${}替换成变量的值。的,如果你配置了二级缓存,那么。如果数据库结果集中的。的,但是可以手动开启。
2025-06-09 09:40:40
856
原创 JAVA理论第七章-MYSQL
先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了,因为查询id的时候,走的覆盖索引,所以效率可以提升很好。非聚簇索引(二级索引):指的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自定义的索引都是非聚簇索引。简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。,在原B+树的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+树,提高区间访问的性能。
2025-06-09 09:34:41
1158
原创 JAVA理论第六章-Web基础网络知识
的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。),是一种创建交互式、快速动态网页应用的网页开发技术,无序重新加载整个网页的情况下,能够更新部分网页的技术。三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是。,但处于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它。
2025-06-08 09:00:00
457
原创 JAVA理论第四战-线程池
在实际使用中,线程时很占用系统资源的,如果对线程管理不完善的话很容易导致系统问题。因此对线程管理不完善的话很容易导致系统问题。因此,在大多数并发框架中都会使用。,相对而言存在一定的风险,因为我们提交的时候根本不知道这个任务会被丢弃,可能造成数据丢失。,让你感知到任务被拒绝了,我们可以根据业务逻辑选择重试或者放弃提交等策略。,而是将某些任务回退到调用者,让调用者去执行它。原理:遍历线程池中的所有线程,然后依次中断。,它也存在一定的数据丢失风险。(重复此过程),通常是。关闭线程池,可以通过。
2025-06-07 13:28:06
610
原创 JAVA理论第三章-多线程
如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发送,线程通过调用其中一个wait()方法,在对象的监视器上等待,直到当前的线程放弃此对象的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与该对象上主动同步的所有线程进行竞争。线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等。join()方法,等待其他线程终止,在当前线程中调用一个线程的join()方法,则。,是cpu调度的分派的基本单位,是比。
2025-06-07 13:27:37
602
原创 JAVA理论第五章-JVM
设置每个线程的大小。标记复制:将可用的内存分为两部分,标记过程相同,清理过程是将非垃圾挪到另一边,把原有一边全部删除,优点 解决垃圾多 和空洞问题 但是内存利用率不是很高。核心思想就是,堆中的对象每被引用一次,则计数器加1,每减少一个引用就减1,当对象的引用计数器为0时可以被当作垃圾收集。java语言规范并没有明确的说明JVM使用哪种垃圾回收算法,但是常见的用于【发现垃圾】的算法有两种,引用计数算法和根搜索算法。Java中可作为GC Root的对象有()线程栈中的本地变量,静态变量,本地方法栈中的变量。
2025-06-07 13:25:31
1245
原创 JAVA理论第二章-集合
list用了toArray转数组后,如果修改了list内容,数组不会影响,当调用了toArray以后,在底层是它进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响。list会受到影响,因为它的底层使用的Arrays类中的一个内部类ArrayList来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候先栈顶开始弹出数据(最后一个数据被第一个读出来)
2025-06-07 12:48:17
786
原创 安卓Setting源码-搜索
初始化后,数据存储在以下路径:/data/user_de/0/com.android.settings/databases/search_index.db。在对其进行循环遍历解析出所有 BasePreferenceController 实例,用于动态管理 Preference 的展示逻辑和搜索索引生成。跳转后是 search_bar.xml 或者是search_bar_two_pane_version.xml。在 Android 设置应用中,搜索索引通常在 首次进入搜索界面时自动初始化。
2025-06-07 09:00:00
1606
原创 Preference基础构件类
一、Preference 是Android app中重要的控件之一,Settings 模块大部分都是通过Preference 实现的.二、常用Preference控件如下:Preference 控件对应 View 控件控件功能含义PreferenceTextView基础文本项,用于显示简单信息(不可编辑)。CheckBox复选框选项,保存布尔值(true/falseEditText弹出对话框输入文本,保存字符串值。弹出列表选择项,保存选定项的键值对(如。
2025-06-06 09:00:00
535
原创 Android Settings 数据库生成、监听与默认值配置
在SetttngsProvider的启动过程中,会创建数据库,把默认设置的数据值写入数据库,然后将数据库中的数据全部迁移到xml文件中然后为了通过Settings.java对使用SettingsProvider进行了封装。
2025-06-05 15:37:07
777
原创 MTKSettings安卓源码解析-界面
TopLevelSettings是 Android 设置应用的 主界面核心 Fragment,继承自 DashboardFragment,布局文件res/xml/top_level_settings.xml,用于展示一级菜单项,比如网络、声音、显示等。getCategoryKey从DashboardFragmentRegistry的PARENT_TO_CATEGORY_KEY_MAP中取得CategoryKey的值,PARENT_TO_CATEGORY_KEY_MAP是一个Map类型的变量。
2025-06-05 15:29:14
1030
原创 安卓四大组件&数据存储&Handler
activity存在”运行中,暂停,停止,销毁‘这四种状态,当activity存在栈顶的时候就是运行中,此时用户可以对其进行正常的交互,当activity被另一个透明的activity或者不是全屏的activity挤下栈顶后,就处于暂停状态,此时我们原本的activity依旧可见数据依然保持。SharedPreferences是Android的一个轻量级存储工具,它采用的存储结构是Key-Value的键值对方式,类似于Java的Properties,二者都是把Key-Value的键值对保存在配置文件中。
2025-06-05 11:21:50
1150
原创 Hashmap 和 hashtable ConcurrentHashMap 区别
HashTable使用的是Synchronized关键字修饰,ConcurrentHashMap是JDK1.7使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。ConcurrentHashMap中的synchronized只锁定当前链表或红黑树的首节点,只要hash不冲突,就不会产生并发,效率有提示N倍。ConcurrentHashMap底层是数组+链表/红黑树。
2024-08-20 15:59:34
344
1
原创 MYSQL如何实现事务?
redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,而undo log不同,它主要记录的是逻辑日志。当事务回滚的时候,通过逆操作来恢复数据,若删除一条数据,就会在undo log日志文件中新增一条delete语句,如果发生回滚则执行逆操作。
2024-08-16 13:44:43
1620
原创 JVM-类加载器、双亲委派模型
由于是双亲委派机制,java.lang.String的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有main方法。类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。如果加载的类在上级找到,则子加载器不用加载,例如String类。对类的静态变量,静态代码块执行初始化操作。
2024-08-15 01:00:00
414
原创 JVM-运行数据区(堆、栈、元空间)
每个线程运行时所需要的内存,成为虚拟机栈,先进后出每个栈由多个栈帧组成,对应这每次方法调用时所占的内存每个栈帧只能有一个活动栈帧,对应着当前正在执行的那个方法。
2024-08-14 19:09:15
1149
原创 美团一面面经:线程池->事务
在实际使用中 线程是很占系统资源的,因此大多数并发框架都会使用线程池来管理线程1.使用线程池可以重复利用已有的线程执行任务,避免线程在创建时造成消耗2.由于没有线程创建和销毁时的消耗,可以提高系统响应速度3.通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行数量的大小等首先我们可以大致的了解一下线程池的主要核心原理首先 就是创建一个池子,里面是空,提交任务的时候,池子会创建新的线程对象,任务执行完毕,线程归还给池子。下次再次提交任务时,不需要创建新的线程,直接复用已有的线程即可。
2024-05-16 17:51:44
596
原创 美团一面面经:索引:数据结构B+树->索引失效->索引的设计原则
索引是存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查询速度,提高数据库的性能,核心思想 空间换取时间1.创建唯一性索引,保证数据库表中每一行数据的唯一性2.大大加快数据的检索速度,这也是创建索引的最主要原因3.加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
2024-05-16 17:00:31
774
原创 美团一面面经:Spring生命周期的具体详细过程,三级缓存的设计原理
问的是三级缓存原理 但是此处文章扩展了总的来说 我们springbean 的生命周期无非就四步实例化、属性赋值(也叫依赖注入)、初始化、销毁我们本文在上篇的基础上进行简略概述 并且把重点放在bean是如何进入单列池的。也就是初始化阶段。
2024-05-16 15:25:10
790
原创 Redis之双写一致性篇
!本文章为学习笔记问题:redis作为缓存,mysql的数据如何与redis进行同步?双写一致性:当修改了数据库的数据同时更新redis缓存的数据,缓存和数据库必须要保持一致性(强一致性或者最终一致性都行反正就是一致即可)如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据可以通过两次删除缓存来控制脏数据,但是延迟的时机很难把握,所以无法完全杜绝脏数据,不能做到强一致性。
2024-04-17 17:27:28
435
1
原创 异常处理机制原理剖析
配置了自定义的异常处理器后,默认的异常处理器就不会被加载,当配置了<mvc:annotaion-driven/>或配置了注解@EnableWebMvc后,默认的异常处理器和自定义的处理器异常解析器都会被注册 这意味着在启动注解驱动的springmvc后,不仅会启用默认的异常处理器还会注册你自定义的异常处理器(当然你必须自定义了异常处理器),这确保你同时享有默认的异常处理机制和你自己定制的异常处理。HandlerExceptionResolver接口:完成自己自定义的异常处理器。在学习本文章时需了解。
2024-04-16 08:52:07
423
原创 SpringMVC的异常处理机制
异常分为编译时异常和运行时异常,编译时异常我们try-cache进行捕获,捕获后自行处理,而运行时异常是不可预期的,就需要规范编码来避免,在SpringMVC中,不管是编译异常还是运行时异常,都可以最终由SpringMVC提供的异常处理器进行统一处理,这样就避免了随时随地捕获异常的繁琐性。当然除了繁琐之外,我们在进行前后端分离异步开发时,往往返回统一格式的结果给客户端,例如:{"code":200,"message":"","data":{"username":"haohao","age":null}},即
2024-04-16 08:36:33
693
原创 spring boot的自动配置原理
EnableAutoConfiguration又组合了注解@Import(AutoConfigurationImportSelector.class) (该类是importSelector接口的实现类) 该类重写了 String[] selectImports(...)方法,经过层层调用最终得到配置文件。spring boot就能帮我们自动注入一个DispatcherServlet ,并且在方法上为我们声明了@Bean注解 最后将方法的返回值自动注入到IOC容器中。注解,这个注解聚合了。
2024-04-15 09:03:47
640
2
原创 SpringMVC关键组件浅析
匹配映射路径对应的Handler,返回可执行的处理器链对象HandlerExecutionChain对象常用组件:RequestMapping HandlerMapping。
2024-03-15 12:26:30
229
1
原创 Sentinel解决雪崩问题的四种常见方式
微服务调用调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。如上图所示,由于某种原因发生故障,而其它依赖于该服务(服务D)的服务无法正常工作,从而导致这些服务也出现故障,这种连锁反应就称为雪崩效应。
2024-03-12 10:25:02
600
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人