基于Quartz实现分布式任务解决方案!
分布式定时任务,你了解多少?基于Quartz实现分布式任务解决方案!https://cloud.tencent.com/developer/article/2335398
总结一下@SpringBootApplication的用法和作用:
用于标识Spring Boot应用程序的入口类。
整合了@SpringBooConfiguration、@EnableAutoConfiguration和@ComponentScan等注解的功能。
简化了Spring Boot应用的配置和启动过程。
可以通过SpringApplication.run方法启Spring Boot应用程序。
总结一下@SpringBootConfiguration的用法和作用:
用于标识Spring Boot的配置类。
继承了@Configuration注解的功能,可以定义Bean和其他组件。
可以与@EnableAutoConfiguration注解一起使用,实现自动配置的功能。
简化了配置类的编写,减少了重复的注解。
总结一下@EnableAutoConfiguration的用法和作用:
启用Spring Boot的自动配置机制。
自动根据项目的依赖和配置加载相应的Bean。
简化配置,省去大部分的XML配置和手动配置过程。
使用条件注解机制进行条件装配。
总结一下@ComponentScan的用法和作用:
1.启用组件扫描功能。
2.自动扫描并加载符合条件的组件,包括@Controller、@Service、@Repository等。
3.通过basePackages属性指定要扫描的包路径。
4.可以通过excludeFilters属性排除指定的组件。
Thread.sleep(0)
在Java程序中,Thread.sleep(0)
表示让当前执行的线程暂停执行0毫秒,即不进行任何暂停。这个操作可能看起来没有实际作用,但实际上,它在多线程环境中有着特定的用途。
Thread.sleep(0)
的运行结果和作用如下:
-
线程调度:当线程执行
sleep(0)
时,它会释放CPU给其他线程,即使没有实际的睡眠时间。这可以作为一种让出CPU的方式,尤其是在自旋锁(spinlock)的实现中,当线程需要等待某个条件成立,但又不想进入阻塞状态时,可以使用sleep(0)
来让出CPU,从而避免长时间占用CPU资源。 -
立即响应中断:在执行
sleep
操作的线程中,如果线程被中断(interrupt()
方法被调用),线程会立即响应中断,并抛出InterruptedException
异常。即使sleep(0)
没有实际的睡眠时间,线程仍然会检查中断状态,并响应中断。 -
避免忙等:在某些情况下,线程可能需要不断地检查某个条件是否满足,如果不满足就需要等待。使用
sleep(0)
可以在每次检查后让出CPU,避免线程忙等(busy-waiting),这样可以提高程序的整体性能,尤其是在多核处理器上。 -
控制执行顺序:在某些复杂的多线程场景中,可能需要控制线程的执行顺序。通过
sleep(0)
,可以在不影响整体执行时间的情况下,让某些线程稍微延迟执行,从而控制线程间的执行顺序。
需要注意的是,sleep(0)
并不会释放锁资源,线程仍然持有进入sleep
操作时所持有的所有锁。此外,sleep(0)
并不保证立即让出CPU,因为线程调度是由操作系统决定的,sleep(0)
只是提供了一种建议。
总的来说,Thread.sleep(0)
在某些特定的多线程编程场景中可以提供一种优雅的方式来处理线程间的协作和调度问题。然而,它并不是万能的,开发者在使用时需要根据具体的应用场景和需求来决定是否适合使用。
实现毫米级查询
要实现毫米级查询(即毫秒级查询),你需要考虑多个因素,包括硬件配置、数据库优化、索引设计等。对于一个拥有 400 亿条数据的 OceanBase 数据库,以下是一些可能的考虑:
硬件配置:首先,你需要足够多且性能强大的服务器来支持这样大规模的数据。服务器的 CPU、内存、存储等配置都需要足够强大,以支持高并发的查询请求。
数据库优化:OceanBase 应该提供了一些性能优化的功能,例如分区表、分布式事务等。你需要根据你的查询模式和数据分布情况来进行相应的优化设置。
数据分片和分区:将数据分片和分区可以有效地减少单个查询涉及的数据量,从而提高查询性能。这需要在设计数据库时考虑,并在部署时进行相应的配置。
索引设计:根据你的查询需求,设计合适的索引可以大大提高查询性能。需要注意的是,索引的创建会增加写入操作的开销,所以需要权衡。
负载均衡和集群配置:合理配置负载均衡和集群架构可以确保查询请求能够均匀地分布到各个节点,避免单点瓶颈。
考虑到以上因素,具体需要多少台机器才能实现毫秒级查询,很难在没有更多详细信息的情况下给出确切的答案。通常情况下,这需要进行系统架构设计和性能测试,以找到最优的配置方案。建议你咨询数据库专家或进行性能测试来获取更准确的建议。
2PC宕机的情况
2PC在执行过程中可能发生协调者或者参与者突然宕机的情况,在不同时期宕机可能有不同的现象。
情况一:协调者挂了,参与者没挂
这种情况其实比较好解决,只要找一个协调者的替代者。当他成为新的协调者的时候,询问所有参与者的最后那条事务的执行情况,他就可以知道是应该做什么样的操作了。所以,这种情况不会导致数据不一致。
情况二:参与者挂了,协调者没挂
这种情况其实也比较好解决。如果参与者挂了。那么之后的事情有两种情况:
第一个是挂了就挂了,没有再恢复。那就挂了呗,反正不会导致数据一致性问题。
第二个是挂了之后又恢复了,这时如果他有未执行完的事务操作,直接取消掉,然后询问协调者目前我应该怎么做,协调者就会比对自己的事务执行记录和该参与者的事务执行记录,告诉他应该怎么做来保持数据的一致性。
Oracle分页查询为什么嵌套
Oracle分分页一般查询格式:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
为什么基于ROWNUM的oracle分页实现,要采用三层嵌套的方式?
1 首先,在没有order by clause的情况下,oracle的查询结果的顺序会是不确定的。如上面的例子。
所以order by的使用是应该的,以免因为index等的原因导致不确定的results order。
2 其次,在order by 和 ROWNUM同时使用时,oracle默认的策略是先为伪列rownum赋值,再order by。
引用
rownum与order by同时存在的问题
当 where 后面有rownum的判断,并且存在order by时候,rownum的优先级高!
oracle会先执行rownum的判断,然后从结果中order by,很明显是错误的结果啦!就好像学校要取成绩最好的前10名同学
,结果这种方法一执行,成了取出10名同学,然后按照成绩的高低排序!
这点与SQL Server的TOP完全不同,TOP遇上order by,是先执行order by,在分页的;
解决办法就是先执行order by,然后嵌套执行rownum-----说白啦就是用()改变函数的优先级!
所以,第二层嵌套的目的就是:让结果先order by,再取rownum!
3 再次,因为rownum不可使用 >(=) 来判断的原因,所以需要最外围的第三层嵌套
java内存溢出定位
一、内存溢出问题分类
瞬时流量过大造成的创建大量对象
内存泄漏导致的内存溢出,一般就是程序编码的BUG引起的
二、内存泄漏问题分析
step1: 收集内存泄漏的堆内存异常日志
> 添加HeapDumpOnOutOfMemoryError 和 HeapDumpPath两个参数开启堆内存异常日志:java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Xms4g -Xmx4g -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/tmp/heapTest.log sinaif-XX .jar
step2: 采用系统Linux命令top 查看Java进程内存使用情况;看下这个内存占用情况;举例:系统内存为8G,启动堆内存分配4G, 通过top命令看下Java进程内存占用是否超过50%
step3:再通过 top -Hp pid 查看具体线程占用系统资源
step4: 通过jstack pid 查看具体线程的堆栈信息,排除是否有死锁或者I/O阻塞的问题(检查CPU的使用率和负载情况)
step5:通过 jmap -heap pid 查看堆内存的使用情况,看下老年代的内存是否没有可分配空间
step6: 基本定位出内存泄漏后,具体分析看是什么对象引起的;
step7:jmap -histo:live pid 查看存活对象数量,找出最大的5个对象进行分析
step8: 把step1 设置的堆内存异常文件:heapdump.hprof 下载本地导入到Eclipse MAT 进行分析
step9:导入MAT一般会有提示的:
jsp九大隐含对象,四大作用域
JSP九大隐含对象是指在JSP页面中可以直接使用的预定义变量,它们是:request, response, out, session, application, config, pageContext, page 和 exception。
request: 客户端的请求信息被封装在request对象中。
response: 服务器的响应信息被封装在response对象中。
out: 用于向客户端输出数据。
session: 与请求有关的会话期的内容。
application: 服务器运行的环境和应用程序级别的内容。
config: 服务器的配置信息。
pageContext: 页面上下文,提供了对JSP页面所有对象以及命名范围的访问。
page: 指当前JSP页面本身。
exception: 异常处理相关,只有在包含isErrorPage="true"的页面中才可以使用。
四大作用域指的是:
页面作用域(page scope):仅在当前JSP页面内有效。
请求作用域(request scope):在当前请求内有效,可以通过request.setAttribute()和request.getAttribute()方法设置和获取。
会话作用域(session scope):在当前会话内有效,可以通过session.setAttribute()和session.getAttribute()方法设置和获取。
应用作用域(application scope):在整个应用内有效,可以通过application.setAttribute()和application.getAttribute()方法设置和获取。
js所有内置对象
JavaScript 中的“内置对象”通常指的是由ECMAScript标准定义的对象和类型,包括:
Object
Function
Array
String
Boolean
Number
Symbol
BigInt
以及由JavaScript实现提供的其他对象,如:
Date
RegExp
Error
Math
JSON
还有其他的如 Map, Set, Promise, Reflect, Proxy, WeakMap, WeakSet 等,这些是ES6新增的。
这些对象是JavaScript语言的基础,提供了各种功能,例如,创建对象,操作字符串,进行数学计算等。
由阿里巴巴笔试题看java加载顺序
https://www.cnblogs.com/guodefu909/p/4991612.html
非技术性问题
你未来3-5年的职业规划是什么(埋雷题)
回参考话术:
我目前在XX岗位上处于什么样的阶段,期望未来3年能达到一个什么样的目标(专业型or管理型)。
我未来打算:
1、首先在未来的1年提升自已在XX方面的能力,精进业务水平。
2、然后在未来的2年内,可以独当一面,独立负责一些比较重要或关键的事务,并对结果负责。
3、在3年内,可以将做过的业务进行总结复盘,形成方法论和标准板,同时也希望有机会领导团队完成更加复杂的任务,为公司的发展做出贡献。
你有什么优点和缺点(考察题)
口参考话术:
我认为我个人优点是做事有规划。比如在上家公司任职时,领导给了我一个紧急的xxx任务,在执行的过程中,我会把任务中涉及到的所有与其他人相关的内容都整理出来并罗列成甘特图 时刻把控任条/5况并及时向领导汇报讲度。
如果公司录用你,你如何开展工作(考察题)
口参考话术:
1、入职公司后我会去了解公司每个部门主要负责的工作内容,确保在之后的工作中能快速定位到相关人员,避免无效沟通。(融入团队)
2、同时,我会明确自己的岗位目标和职责,熟悉业务流程后对工作目标进行拆分,并制定详尽的工作计划,严格按照任务的节点去推进并完成工作,并定期向领导请示和汇报自己的工作进度确保项目的正常运行。(熟悉业务+拆分目标执行+获得反馈)
3、在得到有效反馈的基础上,及时复盘和总结自己的工作成果,对自己的工作流程进行进一步的优化选代。
你如何应对工作中的ya力
门参考话术:
我认为在工作中有ya力是常态化的职场现象,而且也无法避免。
重点是如何积极面对和调节(举例)在上一段工作XX项目中感到ya力非常大,原因是接手了一个比较新的领域,但我很快就发现内耗只会更焦虑,如果依靠个人能力无法定位问题,
我开始自己先上网寻找答案边学边做,形成自己的方案后和同事和领导请教讨论。另外我在下班后3/5会去运动,让自己放空调整状态再重新投入到工作之中。
一文搞懂数据库中的“锁”(图文详解)
https://cloud.tencent.com/developer/article/2403364
Java高并发下请求合并处理
https://www.jb51.net/program/2965293ob.htm#_label0
线程池销毁过程总结
ThreadPoolExecutor回收工作线程,一条线程getTask()返回null,就会被回收。
分两种场景。
- 未调用shutdown() ,RUNNING状态下全部任务执行完成的场景
线程数量大于corePoolSize,线程超时阻塞,超时唤醒后CAS减少工作线程数,如果CAS成功,返回null,线程回收。否则进入下一次循环。当工作者线程数量小于等于corePoolSize,就可以一直阻塞了。
- 调用shutdown() ,全部任务执行完成的场景
shutdown() 会向所有线程发出中断信号,这时有两种可能。
2.1)所有线程都在阻塞
中断唤醒,进入循环,都符合第一个if判断条件,都返回null,所有线程回收。
2.2)任务还没有完全执行完
至少会有一条线程被回收。在processWorkerExit(Worker w, boolean completedAbruptly)方法里会调用tryTerminate(),向任意空闲线程发出中断信号。所有被阻塞的线程,最终都会被一个个唤醒,回收。
Synchronized和Lock的区别
https://www.jianshu.com/p/09d5ba4bfb7a
synchronized、volatile区别
https://blog.csdn.net/2301_77822280/article/details/130693749
wait和sleep区别
带源码详解: https://zhuanlan.zhihu.com/p/471290845
总结:https://blog.csdn.net/qq_40742428/article/details/121621333
请求url前端到后端都有哪些过程
一、当输入url后,全过程
一般会经历以下几个过程:
1、首先,在浏览器地址栏中输入url
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
5、握手成功后,浏览器向服务器发送http请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到HTTP响应
8、读取页面内容,浏览器渲染,解析html源码,并请求html代码中的资源(如js、css、图片等)
9、断开TCP连接
10、浏览器对页面进行渲染呈现给用户
11、ajax查询
其中,步骤2的具体过程是:
浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。
线程池创建的四种方法是什么
https://www.php.cn/faq/465994.html
JVM(Java 虚拟机)的原理
JVM(Java 虚拟机)的原理涉及多个关键方面:
1. 类加载机制:JVM 负责将 Java 类加载到内存中。这包括通过类加载器按照特定的规则查找和读取类的字节码,并将其转换为可执行的内部数据结构。
2. 内存管理:
- 堆(Heap):用于存储对象实例。
- 栈(Stack):存储方法的局部变量、操作数栈等。
- 方法区(Method Area):存储类信息、常量池等。
3. 垃圾回收:自动回收不再使用的对象,释放内存空间,以避免内存泄漏。
4. 字节码执行:通过解释器或即时编译器(JIT)将字节码转换为机器码执行。
5. 运行时数据区:包括程序计数器、虚拟机栈、本地方法栈等。
6. 异常处理:能够处理 Java 程序中的异常情况,并在必要时终止程序的执行。
7. 多线程支持:为多个线程的并发执行提供支持和协调。
总的来说,JVM 为 Java 程序提供了一个独立于底层操作系统和硬件的运行环境,保证了 Java 程序的可移植性和稳定性。
JVM 的执行原理
JVM 的执行原理主要包括以下几个步骤:
- 类加载:
- 当程序运行时,需要使用某个类,JVM 会通过类加载器将对应的字节码文件加载到内存中。
- 类加载器按照双亲委派机制进行加载,先委托父类加载器尝试加载,若父类加载器无法加载,再由子类加载器进行加载。
- 连接:
- 验证:检查字节码的合法性和安全性。
- 准备:为类的静态变量分配内存,并设置初始值。
- 解析:将符号引用转换为直接引用。
- 初始化:执行类的初始化代码,为静态变量赋予正确的值。
- 字节码执行:
- 解释执行:通过解释器将字节码逐行解释为机器指令执行。
- 即时编译(JIT):热点代码(频繁执行的代码段)会被 JIT 编译器编译成本地机器码,提高执行效率。
- 内存管理:
- JVM 会自动管理内存,包括为对象分配内存空间(在堆中)和回收不再使用的对象(垃圾回收)。
- 异常处理:在程序执行过程中,当出现异常时,JVM 会根据异常类型进行相应的处理。
- 线程管理:支持多线程的并发执行,为每个线程分配独立的栈空间。
这些步骤协同工作,使得 Java 程序能够在 JVM 中安全、高效地运行