Java
文章平均质量分 53
小海海不怕困难
可以,但是得加钱
展开
-
池化技术介绍
提前保存大量的资源,以备不时之需以及重复使用。池化技术应用广泛,如内存池,线程池,连接池等等。内存池相关的内容,建议看看 Apache、Nginx 等开源 web 服务器的内存池实现。由于在实际应用当做,分配内存、创建进程、线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。原创 2023-08-19 21:41:27 · 4554 阅读 · 0 评论 -
零拷贝原理
须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区,CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中, 接着在应用程序中,调用 write() 方法,把用户空间缓冲区中的数据拷贝到内核下的 Socket Buffer 中。最后,把在内核模式下的 SocketBuffer 中的数据赋值到网卡缓冲区(NIC Buffer)网卡缓冲区再把数据传输到目标服务器上。在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了 2 次 cpu 的上下文切换,对于效率有非常大的提高。原创 2023-07-01 15:39:47 · 4553 阅读 · 0 评论 -
通过反射机制获取父类在内的所有属性字段
我之前写的通过反射拿到接口入参是这样写的,但是这样写有一个问题,就是无法获得父类的参数信息,导致日志无法打印出全部参数。原创 2023-07-12 21:03:10 · 5807 阅读 · 0 评论 -
Web项目中耗时操作,用异步请求,减少请求等待时间,使用Redis保证操作幂等性
最近项目中碰到了一个接口需要比较耗时的操作,但是我们公司前后端交互的网关设置了超时时间。因此我需要设置出一个方案保证给用户比较快的响应,又保证任务执行了。因此我采用了,下面的操作方式。客户端发送请求后,我会先去Redis中检查是否还有任务在执行,如果有则不开启异步线程,如果没有则开启异步线程进行数据的业务操作。下面就是我写的伪代码。原创 2023-07-09 22:31:27 · 4746 阅读 · 0 评论 -
Nacos 配置更新的工作流程
Nacos Client 端需要获取服务端变更的配置,前提是要有一个比较, 也就是拿客户端本地的配置信息和服务端的配置信息进行比较。一旦发现和服务端的配置有差异,就表示服务端配置有更新,于是把更新的配置拉到本 地。在这个过程中,有可能因为客户端配置比较多,导致比较的时间较长,使得配置同步较慢的问题。所谓长轮训,(如图)就是客户端发起一次轮训请求到服务端,当服务端配置没有任何变更的时候,这个连接一直打开。进行判断,服务端会逐个比较这些配置中 md5 不同的 key,把存在更新的 key 返回给。原创 2023-07-02 14:46:39 · 4811 阅读 · 0 评论 -
Java的SPI
不过,在Java里面并没有提供实现,因为不同的数据库厂商,会有不同的语法和实现。所以只能由第三方数据库厂商来实现,比如Oracle是oracle.jdbc.OracleDriver,mysql是com.mysql.jdbc.Driver. 然后在应用开发的时候,根据集成的驱动实现连接到对应数据库。然后第三方可以实现这个接口来完成功能的扩展和实现。实例化会造成性能开销,并且加载一些不需要用到的实现类,会导致内存资源的浪费,在这个目录下,以接口的全限定名命名的配置文件,文件内容是这个接口的实现类。原创 2023-07-01 11:58:23 · 4708 阅读 · 0 评论 -
String、StringBuffer、StringBuilder 区别
最后是 StringBuilder,它比 StringBuffer 的性能高,因为 StringBuffer 加了同步锁。String 内部的 value 值是 final 修饰的,所以它是不可变类。所以每次修改 String 的值,StringBuffer 和 StringBuilder 是可变类,字符串的变更不会产生新的对象。String 的性能是最的低的,因为不可变意味着在做字符串拼接和修改的时候,需要重新。String 是不可变类,所以它是线程安全的。StringBuilder 不是线程安全的。原创 2023-07-01 11:36:37 · 4561 阅读 · 0 评论 -
受检异常和非受检异常
所以,除了 Error 和 RuntimeException 及派生类以外,其他异常都是属于受检异常,所谓的受检异常,表示在编译的时候强制检查的异常,这种异常需要显示的通过。而非受检异常,表示在编译器可以不需要强制检查的异常,这种异常不需要显示去捕捉。比如数据库异常、文件读取异常,这些异常是程序无法提前预料到的,但是一旦出现问。Exception 表示程序中的异常,可能是由于程序不严谨导致的,比如。这种异常和程序本身无关,所以不需要检查,属于非受检异常。行时异常,也是属于非受检异常。原创 2023-07-01 11:28:19 · 4732 阅读 · 0 评论 -
new String(“abc“)到底创建了几个对象?
1. 如果 abc 这个字符串常量不存在,则创建两个对象,分别是 abc 这个字符串常量,首先,这个代码里面有一个 new 关键字,这个关键字是在程序运行时,根据已经加载。象引用,如果拿不到,就会在堆内存里面创建一个”abc”的 String 对象。abc”的引用,所以只需要从常量池获取对应的引用就可以了,不需要再创建。的字符串成员变量是 final 修饰的,所以它是一个字符串常量。然后,在这个 String 的构造方法里面,传递了一个“abc”的定义,因为字符串常量池里面已经存在了字面量。原创 2023-07-01 11:24:38 · 4418 阅读 · 0 评论 -
JDK 动态代理为什么只能代理有接口的类?
嗯,这个问题的核心本质,是 JDK 动态代理本身的机制来决定的。首先,在 Java 里面,动态代理是通过 Proxy.newProxyInstance()方法来实现的,它需 要传入被动态代理的接口类。2. 在 Java 里面,类的继承关系的设计,更多的是考虑到共性能力的抽象,从而提高。动态代理的实现规范),所以就导致 JDK 里面的动态代理只能代理接口,而不能代理。代码的重用性和扩展性,而动态代理也是在做这样一个事情,它封装了动态代理类。口的,那这个时候,JDK 动态代理确实无法满足。原创 2023-07-01 11:14:25 · 4803 阅读 · 0 评论 -
fail-safe 机制与 fail-fast 机制分别有什么作用
由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中 对原集合所作的修改并不能被迭代器检测到比如这种情况 , 定义了一个 CopyOnWriteArrayList,在对这个集合遍历过程中,对集合元素做修改后,不会抛出异常,但同时也不会打印出增加的元素。Fail-fast : 表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛ConcurrentModificationException 异常,从而导致遍历失败,像这种情况。原创 2023-06-30 17:26:24 · 4817 阅读 · 0 评论 -
Java的引用
其实java有4种引用,4种可分为强、软、弱、虚。我们将从这四个方面入手进行介绍。首先看到我们有一个类叫M,在这个类里我重写了一个方法叫finalize(),我们可以看到这个方法是已经被废弃的方法,为什么要重写他呢?主要想说明一下在垃圾回收的过程中,各种引用它不同的表现,垃圾回收的时候,它是会调用finalize()这个方法的,什么意思?原创 2023-06-06 22:02:12 · 5591 阅读 · 0 评论