Java
文章平均质量分 80
衣舞晨风
不预测,只应对
展开
-
穿黑风衣的牛奶--生产问题之CompletableFuture默认线程池踩坑,请务必自定义线程池
使用CompletableFuture一定要自定义线程池CompletableFuture是否使用默认线程池和机器核心数有关,当核心数减1大于1时才会使用默认线程池,否则将为每个任务创建一个新线程去处理即便使用到了默认线程池,池内最大线程数也是核心数减1,对io密集型任务是远远不够的,会令大量任务等待,降低吞吐率ForkJoinPool比较适用于CPU密集型的任务,比如说计算。原创 2024-08-09 22:45:00 · 1069 阅读 · 0 评论 -
酷家乐--应用频繁报出cause java.net.SocketTimeoutException: Read timed out怎么办
网络层面的问题在此做个总结,从tcp层、应用层以及工具的使用等方面进行阐述。原创 2024-08-01 23:00:00 · 1217 阅读 · 0 评论 -
转转技术--什么!服务器内存又双叒叕打满了!
面对内存使用率的异常,我们不仅要关注即时的解决方案,还需要考虑如何从根本上避免此类问题的再次发生。如使用优化数据结构、减少不必要的计算、采用懒加载等策略,以及建立细致的内存监控体系等。性能优化不应该仅仅是面对问题时的临时行动,而应该成为开发文化的一部分。原创 2024-04-10 22:00:00 · 965 阅读 · 0 评论 -
Unknown lifecycle phase “.test.skip=true“. You must specify a valid lifecycle phase or a goal in the
【代码】Unknown lifecycle phase “.test.skip=true“. You must specify a valid lifecycle phase or a goal in the。原创 2024-03-14 13:13:24 · 509 阅读 · 0 评论 -
记一次RocketMQ Client超时问题排查
org.apache.rocketmq.shaded.io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: ClientCall started aft原创 2023-12-16 00:17:14 · 2155 阅读 · 0 评论 -
Kubernetes中Java应用Heap Dump
伴随着微服务及容器化的发展,越来越多的应用运行在kubernetes集群中,运维、调试的问题也随之而来。以Java为例,当线上环境出现内存问题,比如OOM,这时候需要Dump内存进行分析的时候,就会发现对于普通开发人员来说他们没有操作kubernetes集群机器的权限,从而导致,Dump出来的文件无法回传到开发手中进行MAT之类的分析。本文的解决办法是这样的,当用户需要Dump某个应用实例的时候,只需要在实例终端界面点击一下按钮,后台会自动Dump Heap到OSS上,上传完成后,会将下载的信息展示在列表原创 2021-02-07 09:17:55 · 1937 阅读 · 0 评论 -
阿里 Arthas 读书笔记
thread查看当前线程信息,查看线程的堆栈。参数说明:参数名称参数说明示例id线程id[n:]指定最忙的前N个线程并打印堆栈thread -n 3[b]找出当前阻塞其他线程的线程thread -b[i ]指定cpu占比统计的采样间隔,单位为毫秒注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。jvm查看当前JVM信息。使用参考:$ jv原创 2021-02-07 09:16:23 · 398 阅读 · 1 评论 -
Java Fork/Join与协程
一、概览Fork/Join并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术。Fork/Join并行算法是我们所熟悉的分治算法的并行版本,典型的用法如下:Result solve(Problem problem) { if (probl原创 2018-04-22 17:52:34 · 1802 阅读 · 0 评论 -
Java并发编程的艺术--volatile的定义与实现原理
      Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保原创 2018-04-25 21:51:08 · 763 阅读 · 0 评论 -
排查Java的CPU性能问题
最近在github上看到了一个很实用一些脚本,github地址: https://github.com/oldratlee/useful-scripts其中有一个(show-busy-java-threads)用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。于是尝试了一把,具体案...原创 2018-05-13 10:21:32 · 1842 阅读 · 0 评论 -
Java并发编程的艺术-final域的内存语义
final域的重排序规则 对于final域,编译器和处理器要遵守两个重排序规则。在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。写final域的重排序规...原创 2018-05-16 07:35:47 · 723 阅读 · 0 评论 -
Java volatile的内存语义与AQS锁内存可见性
提到volatile首先想到就是:保证此变量对所有线程的可见性,这里的 “可见性” 是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。禁止指令重排序优化。  &原创 2018-05-23 19:51:00 · 3423 阅读 · 6 评论 -
Java NIO AIO 基本概念
一、NIO在介绍NIO编程之前,我们首先需要澄清一个概念:NIO到底是什么的简称?有人称之为New I/O,因为它相对于之前的I/O类库是新增的,所以被称为New I/O,这是它的官方叫法。但是,由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O),由于非阻塞I/O更能够体现NIO的特点,...原创 2018-10-02 09:01:50 · 5439 阅读 · 1 评论 -
NIO零拷贝与操作系统零拷贝
零拷贝的定义Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.在 OS 层面上的 Zero-copy 通常指避免在 用户态(User-space) 与 内核态(Kernel-space) 之间来回拷贝数据。Netty 中的 Zero-copy 与 OS 的 Zero-cop...原创 2018-10-02 09:24:17 · 1692 阅读 · 1 评论 -
Java Lambda表达式 实现原理分析
本文分析基于JDK 9一、目标本文主要解决两个问题: 1、函数式接口 到底是什么? 2、Lambda表达式是怎么实现的?先介绍一个jdk的bin目录下的一个字节码查看工具及反编译工具:javap 二、函数式接口@FunctionalInterfaceinterface IFunctionTest<T> { public void prin...原创 2018-04-06 07:39:10 · 25080 阅读 · 8 评论 -
Java sleep和wait的区别
sleep() 方法 wait() 方法 sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(l...原创 2018-04-05 10:44:18 · 10018 阅读 · 0 评论 -
Java JVM常用命令 笔记
1、查看磁盘的IO负载jiankunking@ubuntu:~$ iostat --manUsage: iostat [ options ] [ <interval> [ <count> ] ]Options are:[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]...原创 2018-03-25 19:48:32 · 1437 阅读 · 0 评论 -
Java并发编程实战--读书笔记(目录)
一、重点章节摘录1、 闭锁 CountDownLatch 2、FutureTask 3、计数信号量(Semaphore) 4、 事实不可变对象 5、协作对象间的死锁与开放调用 6、通过线程转储信息来分析死锁 7、Amdahl定律 8、this引用逸出 9、显式的Condition对象 10、双重检查加锁( double check lock)与延迟初始化占位二、每章笔原创 2017-06-08 08:04:37 · 3379 阅读 · 3 评论 -
一次Java线程池误用引发的血案和总结
这是一个十分严重的问题自从最近的某年某月某天起,线上服务开始变得不那么稳定。在高峰期,时常有几台机器的内存持续飙升,并且无法回收,导致服务不可用。例如GC时间采样曲线:和内存使用曲线:图中所示,18:50-19:00的阶段,已经处于服务不可用的状态了。上游服务的超时异常会增加,该台机器会触发熔断。熔断触发后,改台机器的流量会打到其他机器,其他机器发生类似的情况的可能性会提高,极端情况会引起所有服务转载 2018-02-04 15:59:02 · 10622 阅读 · 0 评论 -
JVM 堆与栈
Java Heap Memory堆内存(heap memory)是被用来在runtime的时候给对象和jre的那些class分配内存的。注意是runtime的时候。不管你何时创建对象,创建任何一个对象,这些对象都是被创建在了heap空间里的。那个我们熟悉的gc(垃圾回收站)负责把那些不再被引用(reference)...转载 2018-02-27 19:11:41 · 887 阅读 · 0 评论 -
Java 枚举实现原理
枚举 反编译示意枚举类如下:package com.jiankunking.test;public enum ApplicationInterfaceTypeEnum { dubbo("dubbo", 1), webapp("webapp", 2), custom("custom", 3); private String name; private int...原创 2018-02-23 20:26:17 · 6091 阅读 · 1 评论 -
Java AQS 梳理
AQS:AbstractQueuedSynchronizer1、设计简介AQS的实现是基于一个FIFO的等待队列。使用单个原子变量来表示获取、释放锁状态(final int)改变该int值使用的是CAS。子类应该定义一个非公开的内部类继承AQS,并实现其中方法。AQS支持exclusive与shared两种模式。内部类ConditionObject用于支持子类实现exclus...原创 2018-03-03 20:01:45 · 6802 阅读 · 2 评论 -
Java 内存 占用高 模拟及排查
模拟线上排查内存占用高的问题1、模拟代码如下package com.jiankunking.memory;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.HashM...原创 2018-03-29 21:36:47 · 3380 阅读 · 0 评论 -
Java CPU 占用高 模拟及排查
模拟线上排查CPU占用高的问题 1、模拟代码如下package com.jiankunking.cpu;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;/** * Created by jiankunking on 2018/3/29. */@Co...原创 2018-03-29 22:12:06 · 3469 阅读 · 0 评论 -
Java Runnable和Thread
刚才刷知乎的之后,突然刷到一个问题:Thread与Runnable区别?然后我看了一下源码,发现Runnable是一个接口:@FunctionalInterfacepublic interface Runnable { public abstract void run();}而Thread是实现了Runnable接口的一个类 我有点好奇的就是这两个有啥好纠结的?...原创 2018-04-07 16:46:17 · 864 阅读 · 0 评论 -
Java NIO 浅析
在阅读本文前,强烈建议阅读一下:《Java NIO AIO 基本概念》如何结合事件模型使用NIO同步非阻塞特性回忆BIO模型,之所以需要多线程,是因为在进行I/O操作的时候,一是没有办法知道到底能不能写、能不能读,只能"傻等",即使通过各种估算,算出来操作系统没有能力进行读写,也没法在socket.read()和socket.write()函数中返回,这两个函数无法进行有效的中断。所以除了多开...转载 2018-10-02 09:38:40 · 504 阅读 · 0 评论 -
Golang 协程 跟Java NIO
《Java NIO AIO 基本概念》《goroutine 调度器(scheduler)》有没有发现Golang协程的schedule跟Java NIO的selector很像?都是依赖epoll(linux)来判断事情有没有完成JDK 7 引入了NIO 2,NIO2用的就是epoll,因此判断一个网络包会不会出现BIO那种情况,就可以看他代码网络部分用的是不是NIO 2。个人微信公众号:...原创 2018-10-02 10:44:03 · 3942 阅读 · 0 评论 -
Java JUC Atomic LongAdder 详解
基于OpenJDK12阅读本文前,推荐先阅读以下两篇文章,以便能更好的对比理解:[译]Java Concurrent Atomic Package详解面试必备:Java JUC AtomicLong 实现解析LongAdder是JDK 1.8 新增的原子类,基于Striped64实现。从官方文档看,LongAdder在高并发的场景下会比AtomicLong ...原创 2019-08-09 07:23:46 · 2088 阅读 · 0 评论 -
[译]ZGC: 一个可伸缩的低延迟垃圾收集器
翻译自:JEP 333地址:https://openjdk.java.net/jeps/333一、摘要Z垃圾收集器,也称为ZGC,是一个可伸缩的低延迟垃圾收集器。二、目标 GC暂停时间不超过10ms 能处理大小从相对较小(几百MB)到非常大(TB级)的堆 与使用G1相比,应用程序吞吐量减少不超过15% 方便日后在此基础上利用彩色指针和内存屏障...原创 2019-07-31 07:48:20 · 720 阅读 · 0 评论 -
[译]Java Concurrent Atomic Package详解
翻译自:Package java.util.concurrent.atomic地址:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html#package.description翻译JDK8而不是12的原因是JDK8对与内存语义部分讲解更加详细。Pack...原创 2019-08-07 11:28:07 · 463 阅读 · 0 评论 -
Java JUC AtomicLong 实现解析
基于OpenJDK12本文的目的是为后续文章解析LongAdder做一个引子,以便两者对比。Atomic Package解析参考(比如lazySet原理解析):[译]Java Concurrent Atomic Package详解AtomicLong的常用方法如下: long addAndGet(long delta):以原子方式将输入的数值与实例中的值(Atom...原创 2019-08-07 20:42:24 · 942 阅读 · 0 评论 -
linux 查看java的安装路径
在linux下,如何找java的安装路径jiankunking@ubuntu:/etc$ whereis javajava: /usr/bin/java /usr/share/java /usr/lib/jvm/java-8-openjdk-amd64/bin/java /usr/share/man/man1/java.1.gzjiankunking@ubuntu:/etc$ ls -lrt...原创 2019-07-19 21:05:03 · 426 阅读 · 1 评论 -
Java 原子操作的实现原理
原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。1.术语定义在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。2.处理器如何实现原子操作32位IA-32处理器使用基于对...原创 2019-03-27 20:01:57 · 1216 阅读 · 0 评论 -
Boxing and Unboxing
C#It is best to avoid using value types in situations where they must be boxed a high number of times, for example in non-generic collections classes such as System.Collections.ArrayList. You can avo...原创 2019-02-18 12:22:55 · 578 阅读 · 0 评论 -
Java GC G1 详解
G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器,G1拥有独特的垃圾回收策略,从分代上看,G1依然属于分代垃圾回收器,它会区分年代和老年代,依然有eden和survivor区,但从堆的结构上看,它并不要求整个eden区、年清代或者老年代都连续。它使用了全新的分区算法。其特点如下:并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。...原创 2019-01-02 18:09:50 · 19191 阅读 · 1 评论 -
Java 12 Shenandoah GC
Shenandoah: An open-source concurrent compacting garbage collector forOpenJDKABSTRACTShenandoah is an open-source region-based low-pause paral-lel and concurrent garbage collection (GC) algorithm...原创 2019-01-10 20:39:04 · 5089 阅读 · 3 评论 -
Java ZGC: A Scalable Low-Latency Garbage Collector
SummaryThe Z Garbage Collector, also known as ZGC, is a scalable low-latency garbage collector.GoalsGC pause times should not exceed 10msHandle heaps ranging from relatively small (a few hundreds...转载 2018-12-26 17:42:40 · 1205 阅读 · 1 评论 -
MEMORY TUNING: KEY PERFORMANCE INDICATORS
When you are tuning the application’s memory &amp;amp; Garbage Collection settings, you should take well-informed decisions based on the key performance indicators. But there are overwhelming amount of m...转载 2018-11-21 12:22:32 · 578 阅读 · 0 评论 -
念念不忘的ReentrantReadWriteLock
来先猜一下ReentrantReadWriteLock会如何实现?都在java.util.concurrent包下,那么可以明确一点,那就是关于锁的实现,应该用的就是AQS,那么,读锁、写锁会不会对应的就是AQS中的共享模式与独占模式?原创 2019-05-16 07:55:03 · 1904 阅读 · 7 评论 -
Java并发编程的艺术:Condition的实现分析
ConditionObject是同步器AbstractQueuedSynchronizer的内部类,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类也较为合理。每个Condition对象都包含着一个队列(以下称为等待队列),该队列是Condition对象实现等待/通知功能的关键。下面将分析Condition的实现,主要包括:等待队列、等待和通知,下面提到的Condition...原创 2018-10-27 09:35:36 · 3378 阅读 · 4 评论