java
java 相关
艾斯比的日常
简单,快乐,分享
展开
-
Java 新生代晋升为老年代的四种情况
大内存对象. 当某个对象占用的内存达到阈值时, 可能会被晋升老年代年龄大的对象. 对象年龄达到阈值后, 会被晋升老年代 survivor 区满了, 对象会晋升为老年代. minor gc 后, eden 和 survivor 区会拷贝到另外一个 survivor 区动态年龄. 当某个年龄和以下年龄的对象占比超过 survivor 50%, 那么该年龄及以上的对象会晋升为老年代...原创 2022-04-01 16:24:11 · 1513 阅读 · 0 评论 -
java 如何调用 shell 命令
我们项目里需要调用本地的 spark-submit 命令, 提交 spark 作业这里举例如何使用 java 执行 shell 命令 /** * 执行并返回状态码 * * @param cmd * @return */ public static int execRetCode(String cmd) { boolean isWindows = System.getProperty("os.name").toLowerCas原创 2022-03-31 01:17:11 · 8947 阅读 · 1 评论 -
springboot tomcat 线程数相关配置
server.tomcat.accept-count =100 # 当所有可能的请求处理线程都在使用时, 传入连接请求的最大队列长度.server.tomcat.max-connections = 10000 # 服务器在任何给定时间接受和处理的最大连接数.server.tomcat.max-threads =200 #最大工作线程数.server.tomcat.min-spare-threads =10 # 最小工作线程数.理解请求进来后, 会创建线程, 数量达到 max-threads, 此时原创 2022-03-22 22:36:56 · 6532 阅读 · 2 评论 -
System.getProperties 和 System.getenv() 区别
System.getProperties 和 System.getenv() 区别System.getProperties 获取到的是 java 的运行时属性使用 -Dkey=value 形式, 可以通过 java 的 System.getProperties 获取到 java -Dkey1=value1 -jar xx.jar System.out.println(System.getProperties().getProperty("key1"));而 System.getenv();原创 2022-03-18 21:58:35 · 515 阅读 · 0 评论 -
如何排查慢接口耗时在哪里
这里推荐使用 arthas 工具来排查, 非常好用附上之前的文章https://blog.csdn.net/u012745499/article/details/122971698这里, 再介绍下 trace 命令查看方法耗时分布例如我想监控 JobService 这个类的 splitJob 方法 一次# 注意在生产环境下, 需要指定 -n 表示监控一次# 否则在高并发情况下方法调用很频繁, 打印会很多, 也会影响接口性能trace *JobService splitJob -n 1注原创 2022-03-17 21:52:06 · 3978 阅读 · 1 评论 -
java 如何运行 jar 包指定类的 main 方法
由于我们项目有多个包含 main 方法类, 需要打包后放到跳板机上执行.记得之前都是配置 manifest 文件, 不过感觉有点死板. 其实可以通过代码指定要运行该 jar 包哪个类的 main 方法这里举例, 我们要运行 abc.jar 的 BizTagQuery 类的 main 方法# 注意要指定类的全限定名, 即包含包名java -cp abc.jar com.xiaomi.BizTagQuery...原创 2022-03-15 21:03:35 · 5776 阅读 · 1 评论 -
maven 如何移除无用的依赖
背景最近在做 sdk 瘦身, 需要移除当前项目里无用的依赖行动进入对应项目 pom.xml 所在目录mvn dependency:analyzepom 文件里, 找到 Unused declared dependencies found 的依赖的, 逐个移除后编译, 如果不报错, 则可以移除该依赖...原创 2022-03-03 14:05:49 · 3934 阅读 · 0 评论 -
为什么 -xms 和 -xmx 设置为相同的值
内存抖动: jvm 堆内存不足时, 会向操作系统申请内存; 对内存空闲时, 会向操作系统释放内存.-xms 和 -xmx 之所以推荐设置为相同的值, 是为了避免内存抖动, 因为这期间不足或者空闲, jvm 向系统申请/释放内存, 会有成本开销好比你的钱都需要我借给你, 那你向我借 1 块钱 10 次, 不如向我借 10 块钱一次, 更加省事....原创 2022-02-28 16:22:44 · 513 阅读 · 0 评论 -
java 性能分析都有哪些维度, 怎么查看这些指标
最近在做我们项目的 java 性能分析. 做了如下维度的指标统计cpu使用 linux 的 top 命令查看目前 cpu 占用情况,一般 20% ~ 50% 都是合理区间, 如果太低, 则 cpu 过剩, 太高, 则可能影响应用性能内存使用 linux 的 top 命令, 查看整个 java 应用消耗系统的内存大小和进程 pidjava 的堆导出 jmap -dump:live,format=b,file=heapDump.bin <pid>, 导出当前 java 应用内存中存活对象原创 2022-02-27 16:09:04 · 354 阅读 · 0 评论 -
jvm 如何查看对象年龄的分代情况
一般的, 我们对于 java 应用会增加打印 gc 日志的参数.对象年龄可以理解为对象在新生代里 eden 和 survivor0, survivor1 之间复制的次数. 在 java8 中, 默认是 15 次, 会回收到老年代.如果想要查看对象年龄的分代情况. 可以指定 jvm 参数 XX:+PrintTenuringDistribution以下是详细打印 gc 日志的参数-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDi原创 2022-02-27 15:34:26 · 2353 阅读 · 0 评论 -
jvm 堆栈在线分析工具
当我们进行 java 性能分析时, 比较常用的是导出 java 应用堆栈信息# 查看 java 应用的 pid, 例如是 150top# 导出堆栈信息到 150.dump 文件# -l 参数表示导出锁的详细信息jstack -l 150 > 150.dump然后可以导入在线堆栈分析网站 https://heaphero.io/ft-index.jsp线程分布死锁检查火焰图...原创 2022-02-21 20:32:05 · 3048 阅读 · 1 评论 -
arthas 简单使用
arthas 用来诊断 java 应用非常高效.下载wget https://arthas.aliyun.com/arthas-boot.jar运行java -jar arthas-boot.jar选择需要 attach 的 java 进程输入数字, 回车即可进入按 q 回车或者 ctrl 表示退出常用命令可以输入前面字母, 按下 tab 会自动补全help 查看帮助, 对于下面每个命令, 后面可以追加 -h 查看具体每个具体命令的帮助. 例如 thread -hdashboa原创 2022-02-16 20:52:03 · 753 阅读 · 0 评论 -
springboot 通过参数指定加载 profile 不生效
今天在部署项目时, 发现自己在命令上明明指定了 profile, 但是仍然加载了 default 的 profile, 百思不得其解. 后来发现是参数的顺序写法了.错误写法java -jar ups_server.jar -Dspring.profiles.active=staging注意, 如果是 -D 的参数应该在 -jar 前面, 如果是 – 的参数应该在 -jar 的后面. 而我当时把 -D 的参数放到了 -jar 的后面, 导致没有成功加载指定的 profile正确写法有两种java原创 2022-01-24 21:42:18 · 1208 阅读 · 0 评论 -
maven shade 插件的小插曲
前两天我们介绍了 maven 解决冲突的 shade 插件https://blog.csdn.net/u012745499/article/details/122310575然而, 昨天业务方反馈, org/objectweb/asm 包冲突, 我们例行地把这个包做了 shade, 自测时, 却发生了问题.lombok 也依赖这个包, 如果把 org/objectweb/asm shade 后, 会导致虽然 shade 成功, 然后其他用户引入后, 项目编译报错, 这里的解决办法是在 shade原创 2022-01-20 21:31:47 · 389 阅读 · 1 评论 -
sentinel 简介
sentinel 是阿里开源的一款流量控制框架, 主要以流量为切入点, 从流量控制, 熔断降级, 系统负载保护等多个维度来维护系统的稳定性.原创 2022-01-13 01:45:10 · 119 阅读 · 0 评论 -
接口的 p99 p99.9 是什么意思
背景想要了解 p99 概念, 我们先了解平均响应时间接口平均响应时间很好理解平均耗时 = 每次接口的耗时求和 / 接口请求次数平均耗时容易计算, 但是会掩盖事实.举个栗子, 我和 pony 马和 jack 马的平均资产可以撼动整个亚洲.P99p99 表示按照响应时间从小到大排序, 排名在 99% 的接口响应时间即为 P99 的时间, 即 99% 的接口请求都小于等于该时间, 1% 的接口请求都大于该时间P99 可以看出接口的 99% 的请求都在某个时间内, 更真实客观地反应接口的响应时间的原创 2022-01-09 02:00:05 · 5039 阅读 · 0 评论 -
java 运行 class 文件, 打印乱码
场景javac 编译单个 java 文件, java 运行 class 文件, System.out.println 打印乱码解决增加编译参数 -encoding UTF-8javac -encoding UTF-8 Xx.java原创 2022-01-06 01:12:17 · 504 阅读 · 0 评论 -
如何解决 maven 第三方 sdk 的 jar 包冲突
背景最近, 我们提供给公司其他部门的 sdk, 对方在引入后, 运行报错, 因为他们项目中依赖的 jar 和我们提供的 sdk 依赖的 jar 冲突.然而, 仅仅使用 exclusions 排除依赖, 可能并不能真正解决问题. 假如我们就是想引入两个不同版本的依赖呢?方案事实上, 已经有成熟的 maven 插件可以做这件事情, 就是 maven-shade 插件.该插件原理就是手动配置好需要重命名的包和要改名为的包, 在 mvn package 时, 就会自动把依赖的 jar 修改 class 文原创 2022-01-04 20:18:47 · 1458 阅读 · 0 评论 -
java 如何编写一个自定义注解
语法是 @interface 修饰// 表示该注解仅作用在类上@Target(ElementType.TYPE)// 运行时可以获取到该注解, 如果不标注则运行时无法获取到该注解@Retention(RetentionPolicy.RUNTIME)public @interface Vip { // 声明 value 方法, 当我们只有一个属性时, 可以省略 value = , 直接输入 value 属性值 // 注解中方法必须是无参数的 // 注解中方法返回值只支持 8原创 2021-12-20 01:50:07 · 1525 阅读 · 0 评论 -
程序计数器是线程私有的吗
程序计数器是线程私有的用于记录多线程下每个线程要执行的指令地址, 我们可以理解为每个线程下次要执行的代码行号. 以便 cpu 时间片分配到时, 会继续执行代码原创 2021-12-19 01:36:57 · 471 阅读 · 0 评论 -
map flatMap 区别
通俗理解map 是做一对一映射, 即把一个对象转换为另外一个对象, 存储起来flatMap 是做一对多映射, 接收一个 Function<? super T, ? extends Stream<? extends R>>, 即我们需要返回一个 Stream 对象. 该 Stream 的元素会平铺出来/** * flatMap */ @Test public void testFlatMap() { List<String原创 2021-12-17 00:58:52 · 212 阅读 · 0 评论 -
如何解决序列化时可以创建出单例对象的问题
新增 readResolve(), 返回值是单例实例即可ObjectInputStream.readObject() 会判断是否有 readResolve(), 如果有则调用, 并作为方法返回值public Singleton readResolve() { return INSTANCE;}原创 2021-12-16 01:14:09 · 345 阅读 · 0 评论 -
resultType 和 resultMap 区别
resultType 的值是类全限定名resultMap 的值是自己定义的 resultMap 标签的 id原创 2021-12-12 14:23:23 · 176 阅读 · 0 评论 -
mybatis 设置 typeAliasesPackage 无法识别 jar 包里的类
解决在实例化 SqlSessionFactory 的方法里增加一句 VFS.addImplClass(SpringBootVFS.class); (放在开头即可)原创 2021-12-09 20:42:14 · 793 阅读 · 0 评论 -
如何覆盖第三方 jar 的类
事实上, jvm 加载类时, 会优先尝试加载 classpath 下的类 (即我们自己写的 .java 文件编译生成的类), 其次加载第三方 jar 包的类, 所以我们可以通过创建同名类的方式, 覆盖第三方 jar 的类原创 2021-12-08 21:41:22 · 1142 阅读 · 0 评论 -
DDD 领域驱动设计简介
DDD 即 domain driven design 领域驱动设计背景贫血模型: 即传统的开发模式, 实体类只有属性没有行为, 都是 Service 层承载所有行为.DDD 与传统的贫血模型不同, 对象包含了行为原创 2021-12-06 21:45:49 · 92 阅读 · 0 评论 -
HashMap 和 HashSet 区别
HashSet 本质是 HashMap, 只不过 value 固定是同一个 new Object() 实例, HashSet 主要使用的是 HashMap 对 key 的 hash 功能原创 2021-12-02 20:39:28 · 393 阅读 · 0 评论 -
dubbo 都支持哪些协议
默认是 dubbo 协议, 基于 hessian 协议 thriftwebservicehttp原创 2021-11-29 22:38:12 · 959 阅读 · 0 评论 -
thrift 简介
thrift 是 facebook 开源的 rpc 框架有三个核心概念protocol 定义消息格式 transport 定义消息如何传输 server 从 transport 获取消息, 用 protocol 反序列化消息, 处理后, 序列化结果, 返回给 transport原创 2021-11-28 20:05:05 · 83 阅读 · 0 评论 -
线程池 submit() execute() 区别
submit() 的参数是 Callable, execute() 的参数是 Runnablesubmit() 的返回值是 Future<T>, execute() 的返回值是 voidsubmit() 可以通过返回值 Future 获取到 Future 对象, 通过 get() 可以获取返回值, 如果有异常, 也会抛出...原创 2021-11-24 21:21:36 · 74 阅读 · 0 评论 -
主线程 工作线程 守护线程区别
对于 java 应用来说主线程 main 方法工作线程 默认创建的线程都是工作线程守护线程, 线程实例对象创建后, start() 前, 调用 setDaemon(true) 效果是主线程执行结束, 守护线程跟着结束; 而如果是工作线程, 是继续执行的, 不受主线程影响...原创 2021-11-22 22:16:40 · 605 阅读 · 0 评论 -
http get 请求可以有请求体吗
http get 请求可以有请求体吗可以rfc 规范并没有规定 get 请求不可以有请求体不过习惯上, get 请求都认为是对请求 uri 的数据传输, 并且有的网络库不支持 get 传输请求体, 例如 okhttp原创 2021-11-18 22:02:56 · 2349 阅读 · 0 评论 -
如何解决 spring 循环依赖
@Lazy 注解使用 set 方法注入原创 2021-11-17 01:38:24 · 347 阅读 · 0 评论 -
SpringBootApplication 注解作用
SpringBootApplication 注解包含一组注解, 点进源码可以看到以下 3 个核心注解@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan原创 2021-11-16 00:23:39 · 429 阅读 · 0 评论 -
cglib jdk动态代理区别
jdk 动态代理需要目标类实现接口, 而 cglib 需要目标类是非 final 修饰的, 不需要目标类实现接口 jdk 动态代理 代理实现 InvocationHandler , cglib 代理实现 MethodInterceptorjdk 动态代理利用反射, cglib 是加载 class, 修改字节码, 生成子类spring 默认使用 jdk 动态代理, 如果目标类没有实现接口, 那么会使用 cglib 代理...原创 2021-11-13 11:19:49 · 239 阅读 · 0 评论 -
threadlocalmap 的 key 为什么设计为弱引用
前置知识threadlocalmap 的 key 是 threadlocal, value 是存储的值threadlocalmap key 是弱引用, value 是强引用弱引用: 对象没有其他强引用, 而只有当前的弱引用时, gc 扫描到, 会回收该对象每个线程都有自己的 threadlocalmap 对象问题如果 threadlocalmap 的 key 是强引用, 那么只要线程存在, threadlocalmap 就存在, 而 threadlocalmap 结构就是 entry 数组.原创 2021-11-12 23:47:55 · 4891 阅读 · 5 评论 -
spring bean 是线程安全吗
spring bean 不是线程安全多线程下对 bean 中的属性操作, 会有线程安全问题例如 int 属性自增就会有问题原创 2021-11-11 23:50:43 · 527 阅读 · 0 评论 -
aqs 原理
aqsabstract queued synchronizer 抽象队列式的同步器包含 volatile int state 和一个 fifo 队列队列里是等待执行任务的线程aqs 的优势是 cas 自旋, 让队列开头的元素尝试获取锁, 避免惊群效应原创 2021-11-10 20:48:06 · 89 阅读 · 0 评论 -
spring 的三级缓存
spring 三级缓存一级缓存: 已初始化完成的 bean 二级缓存: 早期暴露的不完整的 bean, 刚刚实例化对象, 没有依赖注入三级缓存: 有循环引用的代理对象二级和三级都是为了解决循环引用问题原创 2021-11-09 15:51:35 · 245 阅读 · 0 评论 -
spring 事务传播特性
这里以 A.a 事务内调用 B.b 事务举例required 默认级别. a 事务没有开启事务, 那么 b 事务开启新事务; a 事务有事务, 那么 b 事务使用已有的 a 事务 requires_new 表示 a 事务挂起, b 事务总是开启新事务 mandatory 表示 a 事务没有事务, 则抛出异常 support 表示 a 事务有事务, 那么 b 使用 a 事务; 如果 a 事务没开启事务, 那么 b 也不使用事务 nested 表示实际的嵌套事务, 有 savepoint, b 事务原创 2021-11-06 15:46:03 · 67 阅读 · 0 评论