java
文章平均质量分 62
zlpzlpzyd
成长路上......
展开
-
junit单元测试单个测试类正常但是整个项目不通过
最近在做项目使用junit写单元测试的时候,发现了一个奇怪的问题,单个测试类正常但是整个项目不通过,这个问题很奇葩,但是找不到却找不到。思考了一下,可能是共享变量的问题。在此记录一下,方便后面排查问题。如下链接也是碰到了这个问题。原创 2024-06-28 14:34:19 · 173 阅读 · 0 评论 -
JVM垃圾收集算法
JVM垃圾收集算法原创 2023-03-19 18:32:54 · 57 阅读 · 0 评论 -
spring boot(2.4.x 开始)和spring cloud项目中配置文件加载顺序 spring-cloud-starter-bootstrap Marker
从 spring boot 2.4.x 开始,ConfigFileApplicationListener 标记为已过期,监听替换为BootstrapConfigFileApplicationListener(继承了 ConfigFileApplicationListener 作为过渡),用 ConfigDataEnvironmentPostProcessor (EnvironmentPostProcessor 的实现类)代替用于加载配置。在此版本中专门重写了文件加载相关的功能。在启动时添加 vm 参数。原创 2024-02-08 15:21:30 · 1085 阅读 · 0 评论 -
spring boot和spring cloud项目中配置文件application和bootstrap中的值与对应的配置类绑定处理
这样参数的顺序正好对应起来最后匹配 bootstrap 值的问题,例如项目中使用了 nacos 中的配置中心功能,很多参数不需要在项目中进行配置,在 nacos 中进行指定就可以,但是 nacos 中的配置参数与项目是隔离的。加载完文件转换为 Environment 中对应的值之后,接下来需要将对应的值与对应的配置类进行绑定,方便对应的组件取值处理接下来的操作。以迭代器中的值顺序为准与 cache 中进行比对,返回对应的配置类,然后再将对应的配置属性从对应的配置文件中获取。可以发现,对应配置值顺序如下。原创 2024-02-07 17:52:49 · 1796 阅读 · 0 评论 -
spring boot(2.4.x之前版本)和spring cloud项目中自动装配的监听执行顺序
综合上述表述,如果引入了 BootstrapApplicationListener 则优先加载,但是在源码中发现如下正好对应了我们平时写的 spring boot 启动类,可知,在启动时,如果引入了 spring cloud 组件,会先创建一个子容器来加载对应的配置,然后传递到父容器中进行参数传递,完成参数加载。原创 2024-02-07 15:51:01 · 1354 阅读 · 0 评论 -
spring boot(2.4.x之前版本)和spring cloud项目中配置文件的作用
为了防止理解问题,pom.xml 版本依赖如下日常开发中经常使用的配置文件有 application 和 bootstrap(日志相关的例外不做讲解),对应的配置文件后缀分别为 properties 或者 yml(yaml),区别如下。原创 2024-02-06 17:56:44 · 937 阅读 · 0 评论 -
spring boot和spring cloud项目中配置文件application和bootstrap加载顺序
在前面的文章基础上日志配置如果引用了 spring cloud 的组件且有 bootstrap 和 application 相关文件,启动日志如下如果 bootstrap 相关文件存在,先加载,然后再加载 application 相关文件。对应引用了 spring cloud 组件。如果 bootstrap 相关文件不存在,加载 application 相关文件。对应未引用 spring cloud 组件。原创 2024-02-07 09:31:08 · 1156 阅读 · 0 评论 -
java集合ArrayList和HashSet的fail-fast与fail-safe以及ConcurrentModificationException
针对集合的元素移除问题最好还是获取其中的 iterator() 获取对应的迭代器来实现。参考链接。原创 2024-01-23 18:37:57 · 1106 阅读 · 0 评论 -
apache log4j2官方文档
https://logging.apache.org/log4j/2.x/manual/configuration.htmlapache log4j2官方文档原创 2024-01-16 17:38:49 · 539 阅读 · 0 评论 -
spring boot 2.x升级为spring boot 3.x中数据库连接池druid的问题
针对项目中的问题很多,尤其是 spring boot 3 带来的变化大,针对一些问题,需要从源码层次入手看问题。之前整理的升级相关的文章参考链接。原创 2024-01-06 20:07:10 · 1470 阅读 · 0 评论 -
linux支持的零拷贝(zero copy)类型以及java对应的支持
如上述表格,在传统 io 的基础上,mmap 方式少了一次 cpu 复制,sendfile 相比 mmap 少了1次用户态切换,1次内核态切换,系统调用少了1次,sendfile+DMA scatter/gather 在单纯的 sendfile 调用基础上少了1次cpu复制,后面的 direct io、splice、tee 在资源消耗上类似。将内核中的读缓冲区与用户空间的缓冲区进行映射,所有的IO都在内核中完成。将 cpu 的复制操作交给网卡去做,需要网卡支持并且提供对应的驱动程序。原创 2024-01-01 11:50:04 · 471 阅读 · 0 评论 -
linux 的直接direct io O_DIRECT
Direct IO也叫无缓冲IO,裸IO(rawIO),意思是使用无缓冲IO对文件进行读写,不会经过page cache。通常,我们使用的文件流读取、内存映射都属于 Cache IO,因为将数据写入文件,首先会写入cache,最终再落盘到 IO device 或者称为 disk上。cache IO 使得我们在写入、读取(预读取、顺序读取等特性)文件数据的时候,性能得以提升,能够从cache(内存)中读取数据。原创 2024-01-01 01:06:08 · 1103 阅读 · 0 评论 -
java零拷贝zero copy MappedByteBuffer
java零拷贝zero copy MappedByteBuffer原创 2023-12-31 22:13:16 · 951 阅读 · 0 评论 -
java中PhantomReference WeakReference SoftReference垃圾回收触发时机以及使用场景
java中PhantomReference WeakReference SoftReference垃圾回收触发时机以及使用场景原创 2023-12-30 19:55:18 · 1091 阅读 · 0 评论 -
java中的缓冲类HeapByteBuffer和DirectByteBuffer的区别
通过分析可以得出如下HeapByteBuffer 使用简单,每次执行数据读取写入间接创建 DirectByteBuffer,效率低。DirectByteBuffer 使用相对麻烦,但是效率高,需要考虑到通过 ByteBuffer 分配的缓冲区与 jvm 参数 -XX:MaxDirectMemorySize 是否合理的问题,不然的在运行过程中会出现内存溢出问题。原创 2023-12-30 18:28:40 · 975 阅读 · 0 评论 -
java中BufferedInputStream BufferedOutputStream HeapByteBuffer DirectByteBuffer缓冲的区别
HeapByteBuffer 和 DirectByteBuffer 是从 java 1.4 开始添加的类,之前的版本处理缓冲问题需要使用 BufferedInputStream 和 BufferedOutputStream,问题是针对 io 操作只能单向处理,HeapByteBuffer 和 DirectByteBuffer 结合 FileChannel 可以实现对文件的双向处理,即可以通过 FileChannel 实现读写功能。参考链接。原创 2023-12-30 01:11:09 · 806 阅读 · 0 评论 -
缓存cache和缓冲buffer的区别
缓存和缓冲都是为了解决计算机的各个部分的访问速度设计的。针对 cpu 和内存之间的速度慢的问题,设计了 cpu 与内存中间的三个级别的缓存。针对内存与存储设备之间的速度慢的问题,编码在内存层面设计了缓冲区域将读取或者写入的数据批量处理。将存储设备的随机处理变为顺序处理,是空间换时间思想的实现。在日常开发中,遇到的问题瓶颈一般是缓冲的问题。因为内存和 cpu 之间的缓存我们无法控制,但是在内存和硬盘层面的缓冲现有的工具无法满足我们可以自己编码处理。参考链接。原创 2023-12-27 17:03:55 · 1682 阅读 · 0 评论 -
java通过stream实现字符串与map互转
这个string和map互转的问题如果不用 stream 会有很多方式处理,但是用了stream也有很多方式,但是想了一个完全用stream处理的方式如下。1.编写一个方法将以上格式的字符串转换为一个map, key为:前的字符串, value为:后的字符串, 键值对用,分隔;2.编写一个方法将上面生成的map还原成原始字符串,对key进行倒序。要求使用stream进行处理。原创 2023-12-22 20:34:58 · 732 阅读 · 0 评论 -
java伪共享问题
java 伪共享原创 2023-11-22 12:49:12 · 104 阅读 · 0 评论 -
java中的Closeable与AutoCloseable
然后通过语法糖 try-with-resources 在 try 关键字后添加一个小括号,针对 Closeable 或 AutoCloseable 的实现类在编译器编译源代码的时候添加异常处理逻辑来处理流关闭的问题,从而实现了。针对这个,让我想到了虚拟线程的实现 alibaba dragonwell,在 openjdk 8 的基础上修改 jvm 底层源码,在不改变源码的基础上支持一对多的线程模型。其实推出的这些新功能最大的好处就是让语言的使用者偷懒了,因为在底层把这个问题处理了(哈哈哈)原创 2023-11-14 00:39:16 · 188 阅读 · 0 评论 -
java中spi与api的区别
近期看了很多开源组件的源码,发现很多地方地方用到了 spi 的功能,开始思考 spi 与 api 的区别在自己看了很多源码后,发现spi 侧重于抽象层次的概念,目前接触到的就是 java 里大量用到了这个,然而 api 是不限编程语言限制的。例如自己写的很多调用方法(对应其他语言里的函数)。原创 2023-10-29 22:44:57 · 379 阅读 · 0 评论 -
jdk版本与class文件格式major版本对应关系
jdk版本与class文件格式major版本对应关系原创 2023-10-27 14:43:21 · 108 阅读 · 0 评论 -
java中BigDecimal转json精确小数点的问题
创建一个类用户处理 BigDecimal 小数点精确的问题。使用了 jackson,处理如下。然后在代码中添加如下代码。原创 2023-10-23 17:56:28 · 440 阅读 · 1 评论 -
java链式编程对象序列化问题
在使用 openfeign 进行服务之间数据传输时发现了一个问题,数据在下游正常处理,响应到调用端数据也读取到了,但是就是 jackson 转对象序列化时出了问题,异常如下。,将private的构造器修改为public,添加一个默认构造器,效果如下。使用了链式编程进行赋值操作,按照上面的提示就是没有默认构造器。试了一下,运行正常。原创 2023-10-22 19:30:02 · 130 阅读 · 0 评论 -
java项目运行时信息获取
大体思路如下,想要获取启动时处理器数量、jvm 相关信息,操作系统信息、运行机器信息。原创 2023-10-21 23:04:06 · 1118 阅读 · 0 评论 -
java项目容器化(docker)部署注意点
其中,-XX:InitialRAMFraction、-XX:MaxRAMFraction、-XX:MinRAMFraction 标记为过期,对应的替换参数将 Fraction 替换为 Percentage,即 -XX:InitialRAMPercentage、 -XX:MaxRAMPercentage、-XX:MinRAMPercentage。jdk 10原创 2023-10-21 01:56:53 · 413 阅读 · 0 评论 -
jdk对linux cgroup v2容器化环境识别情况
这个影响到 jvm 能否对容器环境进行识别处理。原创 2023-10-21 01:38:31 · 418 阅读 · 0 评论 -
idea中java类属性(字段)链式赋值
idea中java类属性(字段)链式赋值原创 2023-10-20 13:14:12 · 622 阅读 · 0 评论 -
各种jdk的区别
在周志明的书籍《深入java虚拟机》上看过有azul的产品zing和zulu,但是去官网看了一下,现在改名了。网上一些是在 openjdk 的基础上进行了编译,有的是在这个基础上进行了 jvm 的代码重写进行功能优化。在 openjdk 的基础上,添加了一些商用的功能。这些 jdk 在自己对应的公司内部的服务上经历了验证。看这篇文章说开源了jvm的源码,但是还没找到。官方发布的 docker 镜像。官方发布的 docker 镜像。官方发布的 docker 镜像。官方发布的 docker 镜像。原创 2023-10-17 10:57:44 · 337 阅读 · 0 评论 -
jackson日期格式转换LocalDateTime异常 JSON parse error: Cannot deserialize value of type `java.time.LocalDate
例如,传的日期是 2023-10-08 却用 LocalDateTime 解析是不行的,应该使用 LocalDate,有一个比较好的办法,就是使用Unix时间戳传long类型的日期不会有这些问题,如果有时区,另外加上时区即可。如果有,在 filter 或 aop 层次看请求参数中的日期格式。不排除是请求参数格式与接收的类型冲突。确保日期格式、日期类型对应起来。首先一点,看对应的字段上是否有。原创 2023-10-08 10:55:43 · 2466 阅读 · 0 评论 -
对于java线程池ThreadPoolExecutor监控以及参数动态调整的思考
上面两个链接都是一篇文章发布在不同地方,看其中一篇即可。看到了美团技术团队的这篇文章以及加上自己对线程池的了解和看过的源码,有如下思考。原创 2023-10-07 14:59:58 · 253 阅读 · 0 评论 -
alibaba dragonwell jdk 虚拟线程
dragonwell 虚拟线程原创 2023-10-04 03:21:19 · 425 阅读 · 0 评论 -
java 异步发展史 Runnable Callable Future CompletableFuture
异步 Runnable Callable Future CompletableFuture原创 2023-10-03 21:15:11 · 185 阅读 · 0 评论 -
java与netty的类对应关系
client 有一个 EventLoopGroup 用来处理网络 io 操作,server 端有两个,分为 boss 组和 worker 组,boss组是专门用来接收客户端发来的TCP链接请求的,worker组是专门用来处理完成三次握手的链接套接字的网络IO请求的。netty 基于 reactor 线程模型来实现高性能网络通信。服务端监听套接字通道。原创 2023-10-03 19:24:25 · 152 阅读 · 0 评论 -
java并发编程 守护线程 用户线程 main ThreadPoolExecutor CompletableFuture
之前经常使用线程,没有对这个概念做彻底深入了解下面写4个例子来验证一下源码如下看注释的含义是,daemon 为 true 时是守护线程,false 为用户线程。当所有守护线程在执行时 jvm 会退出。原创 2023-10-02 22:12:24 · 438 阅读 · 0 评论 -
spring mvc中DispatcherServlet关键对象
HandlerMapping HandlerMethod HandlerAdapter HandlerExecutionChain原创 2023-10-02 19:29:43 · 641 阅读 · 0 评论 -
servlet 线程模型 异步
在 servlet 3.0 之前,请求与线程的对应关系是1:1,对应jvm与操作系统的线程的关系。从 servlet 3.0 开始,开始有了异步相关功能。容器线程池与业务线程池开始单独处理。原创 2023-10-01 21:49:49 · 131 阅读 · 0 评论 -
spring的bean初始化策略
如果当前没有使用 GraalVM 镜像环境,AbstractAutowireCapableBeanFactory 中指定 instantiationStrategy 的值为 CglibSubclassingInstantiationStrategy,即默认创建对象使用的是 cglib。GraalVM 原生镜像通过启动时设置参数指定 org.graalvm.nativeimage.imagecode,不指定默认为 false。原创 2023-09-23 22:54:06 · 166 阅读 · 0 评论 -
spring中AbstractApplicationContext的refresh()
这个部分的源码看的次数不计其数了,每次看不同开源组件的调用过程中走到这里都有不同的收获。spring 中 AbstractApplicationContext 的 refresh() 是 spring 的核心,几乎所有的逻辑都在是这里间接被调用。如下源码为 spring boot 2.7.15 自带的 spring 5.3.29通过 WebApplicationType 判断是哪个环境判断逻辑如下。原创 2023-09-23 22:49:57 · 233 阅读 · 0 评论 -
jdk 21发布的意义 虚拟线程
lts 支持到 2026年9月,除了 jdk 21,还有 3个lts版本,分别是 jdk 8、jdk 11、jdk17。jdk 8 的 lts 时间最长,到 2030年12月。但是考虑到许可证的问题,一般部署jdk都使用的是 openjdk。现在 spring 官方一直在发布 milestone 版本,过了不久就会发布正式的 spring 6.1 版本相关的组件。spring boot 3.2 开始支持 spring 6.1 相关组件。原创 2023-09-22 10:38:40 · 391 阅读 · 0 评论