java
文章平均质量分 57
shaofei_huai
这个作者很懒,什么都没留下…
展开
-
使用NetworkInterface解决InetAddress.getLocalHost().getHostAddress()获取ip为127.0.0.1问题
InetAddress.getLocalHost().getHostAddress() 根据本机名去/etc/hosts中获取对应ip,所以经常会出现获取到127.0.0.1的情况,使用NetworkInterface.getNetworkInterfaces()从网卡中获取ip可避免该情况。工具类如下import java.net.Inet4Address;import java.net.InetAddress;import java.net.NetworkInterface;...原创 2021-12-10 21:24:51 · 3977 阅读 · 0 评论 -
No implementation defined for org.apache.commons.logging.LogFactory排查思路
该问题在webservice调用时突然出现,项目中其他模块均可正常工作,首先怀疑是最近引入了什么jar冲突导致,eclipse打开pom点击Dependency Hierarchy搜索相应jar后进行排除。 排除后调用仍报错,参考网上解决方案引入以下包排除所有commons-logging后引入commons-discovery与commons-logging仍无效果。<dependency> <groupId>c...原创 2021-09-14 21:37:33 · 1004 阅读 · 0 评论 -
eclipse 使用jmh
大部分开发人员测试时通常使用System.currentTimeMillis计算方法执行时间,但这种方式没有考虑到jvm层面的优化,很多时候得出的测试结果不够精确。如果想进行精确测试还需要使用jmh,其全名为Java Microbenchmark Harness,是由 java 虚拟机团队开发的一款用于 java 微基准测试工具。jmh包含多种测试维度,使用也比较简单。常用注解@BenchmarkMode:对应Mode类,表示测试是使用不同模式,可以使用数组方式例如{Mode.Th...原创 2021-09-07 21:31:33 · 395 阅读 · 0 评论 -
限流算法及guava限流器RateLimiter实现
限流是通过对并发请求进行限速,继而达到保护高并发系统的目的。常见限流算法有漏桶算法及令牌桶算法。其流程可参考下图。漏桶算法思路比较简单,就是将请求放入桶中,然后以固定速率处理桶中请求,当桶满后会丢弃新来的请求。漏桶算法一般依靠有界队列实现。 令牌桶算法则是先创建一个固定大小的令牌桶,按照固定速率向桶中加入令牌,每个请求要先获取到令牌才能进行处理。没获取到令牌的请求则放入缓冲区等待或直接丢弃。 guava限流器RateLimiter...原创 2021-09-01 21:51:09 · 366 阅读 · 0 评论 -
HotSpot编译优化
HotSpot团队在即时编译中采用了一些比较经典的优化手段使编译器编译出运行时最优性能的代码。方法内联 在程序执行过程中,调用一个方法通常要经历入栈和出栈。其执行流程为先将程序执行顺序转移到存储该方法的内存地址,将方法的内容执行完后,再返回到执行该方法前的位置。这种调用流程会产生一定的时间及空间开销。对于一些方法体不大,但调用比较频繁的方法来说,会产生很大的时间和空间的消耗。方法内联就是将被调用方法的代码复制到发起调用的方法之中,避免发生真实的方法调用。方法内联可参考以下...原创 2021-08-29 22:50:16 · 165 阅读 · 0 评论 -
HotSpot编译器与即时编译
大部分主流商用虚拟机中都包含解释器与编译器,解释器与编译器用处不同,当程序需要迅速启动和执行时,解释器先发挥作用,省去编译时间,立即执行。在程序运行后,随着时间推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。在java8中默认使用解释器与编译器搭配的混合模式(mixed mode),如果想只使用解释器可以通过设置-Xint强制虚拟机运行于解释模式(interpreted iode),此时编译器不介入工作。如果想只使用编译器可以通过设置...原创 2021-08-28 21:29:42 · 364 阅读 · 0 评论 -
高性能队列Disruptor
Disruptor是由LMAX开发的一款高性能的有界内存队列,因其卓越的性能,目前再业内广泛应用,LMAX官网使用It’s fast. Very fast.来介绍Disruptor。下图是Disruptor团队对Disruptor与ArrayBlockingQueue原创 2021-10-08 21:43:32 · 203 阅读 · 0 评论 -
java内存模型JMM
java内存模型主要目的是定义程序中各个变量访问规则。就是虚拟机中将共享变量存储到内存和从内存中取出变量这样底层细节。共享变量包括实例字段、静态字段、构成数组对象的元素。Java内存模型中规定了所有的变量都存储在主内存中,每个线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来...原创 2021-09-16 23:09:25 · 104 阅读 · 0 评论 -
java线程生命周期
线程生命周期指线程从创建到消亡中间经历的一系列状态,理解线程生命周期中各种状态对排查多线程bug有一定帮助。目前java线程生命周期基于通用线程生命周期细分为六种状态。通用生命周期 通用生命周期包括新建、就绪、运行、阻塞、死亡五种状态。各状态详细情况如下: 新建:线程在编程语言中被创建,但操作系统中还没分配cpu。 就绪:线程在操作系统中被创建,可以分配cpu执行。 运行:有空闲cpu时,操作系统将cpu分配给就绪状...原创 2021-08-26 22:24:37 · 357 阅读 · 0 评论 -
jvm处理异常
java中所有异常都是Throwable 类或者其子类的实例,Throwable类有两个直接子类Error、Exception。Error为应用程序无法捕获的异常,发生Error时需要中止线程。Exception与Error不同,发生时可捕获异常进行处理。 处理异常包括使用try,catch,finally关键字进行处理 try:标记需要捕获异常的代码。 catch:指定捕获某种异常进行处理。 finally:在try、...原创 2021-10-12 22:06:39 · 262 阅读 · 0 评论 -
spring cloud使用nacos配置中心
nacos配置中心用于存储项目中相关配置,使用配置中心可以达到配置统一管理,动态刷新配置等效果。 nacos配置中心使用比较简单,但坑也不少,先简单介绍下使用再说坑。1.引入spring cloud使用nacos配置中心的jar,spring boot 相关jar自己引一下。 <!-- 引入 spring-cloud-starter-alibaba-nacos-config,此jar要与spring boot版本对应--> <depende...原创 2021-08-19 23:08:10 · 5144 阅读 · 1 评论 -
spring boot 使用redistemplate操作redis
redistemplate是spring对jedis的封装。相对于jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用。以下为redistemplate简单使用。1.引入spring-data-redis <!-- 对于版本号没有要求不需要显示指定version,spring boot已集成该jar --> <dependency> <groupId>org.springframework.data</gro...原创 2021-08-13 23:18:30 · 1052 阅读 · 0 评论 -
java 类加载器与双亲委派机制简介
类加载器 类加载器负责将.class文件加载到jvm中运行,java内置如下三种类加载器,除内置类加载器外,还可以自己实现类加载器。BootstrapClassLoader:启动类加载器,加载 jre/lib 目录下的核心类库ExtClassLoade:扩展类加载器,加载 jre/lib/ext 目录下的文件 AppClassLoader:应用程序类加载器负责加载classpath下字节码文件 自定义类加载器请参...原创 2021-08-22 18:04:01 · 172 阅读 · 2 评论 -
Apache Curator操作zookeeper实现基本增删改查、事务、分布式锁等
Apache Curator封装了一套高级API 简化zookeeper的操作,提供了对zookeeper基本操作,watch,分布式锁等场景封装引入Curator包 需要注意不同Curator兼容不同zookeeper版本,可以去查看下发行版本说明https://cwiki.apache.org/confluence/display/CURATOR/Releases<dependency> <groupId>org.apache....原创 2021-07-23 23:20:06 · 711 阅读 · 1 评论 -
ThreadLocal 使用及原理
多线程并发操作一个共享变量时会造成线程安全问题,使用ThreadLocal可以保证共享变量线程安全。由于同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本,当线程访问ThreadLocal时,每个线程都操作自己的独立副本,避免造成线程安全问题。简单使用 每个线程分别对ThreadLocal赋值、打印。 static ThreadLocal<String> threadLocal = new ThreadLocal&l...原创 2021-08-16 22:57:45 · 163 阅读 · 0 评论 -
java 线程池使用及工作流程
java程序中线程的创建、销毁将会消耗一定的系统资源,从而增加系统的性能开销,为解决该问题,java引入线程池概念,对于频繁创建线程的业务场景,线程池可以创建固定的线程数量,通过lwp映射到系统内核。内置线程池 内置线程池有四种,本质是对ThreadPoolExecutor封装。相对来说优点是拿来即用,缺点也很明显,无法根据自己需求配置不同参数线程池。目前还没用过内置线程池。类型 创建方式 特性 newCachedThreadPool Exec...原创 2021-08-15 22:52:33 · 382 阅读 · 0 评论 -
java 对象内存大小计算(基于64位操作系统)
计算对象大小需要了解java对象内存布局。在HotSpot 虚拟机中,对象在内存中布局分为三块区域,对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头 对象头主要包括Mark Word,对象指针,数组长度Mark Word Mark Word占用8字节空间,其主要用于锁升级。无锁:Mark Word保存对象HashCode,锁标志位是01,是否偏向锁为0。 ...原创 2021-07-29 21:50:25 · 773 阅读 · 0 评论 -
java CountDownLatch 原理及使用
countDownLatch可以理解为一个倒序计数器,在初始化时给计数器赋值,每次操作计数器减1,等计数器为0后才可继续向下执行。通过该特性可以在特定任务执行前使用多线程处理,例如多线程读取文件,然后对文件拼接整合。使用案例 以下代码演示初始CountDownLatch为2的执行流程,当new CountDownLatch(3)时程序会一直阻塞。 public static void main(String[] args) throws InterruptedEx...原创 2021-08-08 22:28:29 · 2276 阅读 · 0 评论 -
java 动态代理与静态代理
代理在生活中比较常见,比如常见的代理商,对工厂进行代理,工厂专注生产,代理商负责经销,用户购买商品从代理商手中购买。java中代理分为动态代理与静态代理,其中动态代理比较常见的有jdk动态代理和cglib动态代理。静态代理 静态代理实现简单,但不够灵活,比较麻烦,要实现与被代理对象一样的接口,创建很多代理类。接口增加方法后代理类与被代理对象都要加方法。以日志代理举例: 1.创建订单接口 /** * 订单接口 * * @author huai...原创 2021-07-26 20:34:25 · 1542 阅读 · 0 评论