- 博客(10)
- 收藏
- 关注
原创 BIO和NIO
显然,NIO编程难度远大于BIO,不仅需要熟悉非阻塞io、多路复用相关的api,还需要熟练掌握多线程,甚至可能需要解决应用层的问题,不像BIO每个连接有自己独立的线程,如果用NIO开发类似http这种请求响应类的协议,请求和响应的对应关系必须仔细设计一番。以tcp为例,主要的io操作包括建立连接、读、写,服务端监听一个端口,多个客户端可以来连接,同一个主机也可以通过多个端口来连接服务端,只要保证客户端的ip和端口不完全相同即可建立一条连接。,多路复用器执行select方法筛选出有io事件的socket,
2024-06-27 21:05:36
601
原创 Java应用内存区域
附:OOM的问题排查,在java应用启动时可以添加参数-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath=来设置当应用出现OOM时自动生成内存快照,也可以在运行时使用jmap -dump:format=b,file= 命令来生成当前内存快照dump文件,使用工具 VisualVM或MAT分析dump文件可以看出在当时各类型对象的数量和大小,找到大对象等,从而推测出内存泄露的位置。6、直接内存:记得释放。
2024-06-16 17:43:27
621
原创 Java锁和分布式锁用法浅析
这里的num自增自减虽然在java层面只有一行代码,但是在cpu执行时其实是多个步骤,至少包括读取数值、计算加1、写回内存,而这中间便可能发生线程切换,例如:线程一读取了num的值为0,然后线程二也读取了num的值为0,线程一计算+1再写回内存值为1,线程二再计算-1然后写回内存值为-1,所以明明应该得到结果为0,但是这里得到的值却是-1,这里最本质的问题就是。的,即由一个线程来执行从外部传进来的诸多命令,一个命令一个命令排着执行,先到的先执行,后到的后执行。Java代码层面最简单的方法就是加锁,
2024-04-26 23:53:26
1010
3
原创 JDK动态代理用法简介
答案是自己想办法提供原始类的对象,图示中我自己new了一个原始类对象obj,然后在invoke方法中直接用反射调用,invoke方法的第二个参数method,就是对应的原始方法,第三个参数就是这个method的实参,这两个参数值都是在proxyInstance调用方法时才动态确定。c、一个InvocationHandler对象,我这里用了匿名内部类,当然可以专门单独写一个类。时,实际都是执行我们的InvocationHandler对象的invoke方法,这就相当于把原始的方法全都给替换了。
2024-04-15 15:06:53
313
原创 Spring启动流程解析
主要是准备工作,在后面执行BF后置的时候,我们会发现context有的属性莫名奇妙的已经有值了,比如beanFactory对象,那么他们的值很可能就是在这里产生的,但是SpringBoot的话是在context构造器中new出的beanFactory,这些逻辑根据context的类型不同而异,有些xml类的context在这里解析了xml并生成beanDefinition存入beanDefinitionMap中。,SpringBoot的tomcat是在这里启动的,端口在此正式监听。
2024-04-10 17:46:33
795
原创 SpringBoot配置文件优先级解析
其实以上的优先级介绍并没有覆盖所有的配置文件类型和配置形式,譬如我们还可以在classpath的config目录中放一个application.yaml,这个文件的优先级应该在哪个位置呢?来自各个地方的配置,最终都存在了这个List中,所以我们会得到一个有序的配置文件列表,其中每一个元素对应一个配置文件。所以其实一共有几种类型的配置文件并不确定,我们可以自行增加,如果项目使用了配置中心,可以查看到其配置数据在List中的位置相对靠前,也就是为什么我们配置中心里的配置优先级高于jar包中的配置。
2024-02-15 23:37:00
1766
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人