JVM & JDK
文章平均质量分 72
JVM & JDK
JdbcUtils
生活不止眼前的苟且,还有诗和远方。
展开
-
arthas实用工具梳理篇
arthas实用梳理篇。原创 2022-09-29 17:01:05 · 1214 阅读 · 0 评论 -
整理一下:遇到的Java服务故障问题及排查方案
常见问题 1:CPU 利用率高问题CPU 使用率是衡量系统繁忙程度的重要指标,一般情况下单纯的 CPU 高并没有问题,它代表系统正在不断的处理我们的任务,但是如果 CPU 过高,导致任务处理不过来,这个是非常危险需要关注的。CPU 使用率的安全值没有一个标准值,取决于你的系统是计算密集型还是 IO 密集型,一般计算密集型应用 CPU 使用率偏高 load 偏低,IO 密集型相反。问题原因:1、频繁 FullGC/YongGC如何排查:查看 gc 日志;jstat -gcutil pid 查看原创 2021-03-28 13:45:20 · 1251 阅读 · 0 评论 -
IO、NIO、Netty分别实现服务端与客户端通信
简化下场景:客户端每隔两秒发送一个带有时间戳的 “hello world” 给服务端,服务端收到之后打印。IO编程IO服务端:public class IOServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8000); // (1) 接收新连接线程 new Thread(原创 2020-08-27 11:45:43 · 4057 阅读 · 0 评论 -
使用 MAT 排查分析 OOM 问题案例
MAT相信有一定经验的开发者多少都会在生产环境上碰到过内存溢出(OOM)的问题吧。对于排查 OOM 问题、分析程序堆内存使用情况,最好的方式就是分析堆转储。Java 的 OutOfMemoryError 是比较严重的问题,需要分析出根因,所以对生产应用一般都会这样设置 JVM 参数,方便发生 OOM 时进行堆转储:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/xxx关于分析堆存储文件的话,推荐使用Eclipse 的 Memory Ana原创 2020-08-13 15:56:54 · 2765 阅读 · 0 评论 -
HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)
事故背景一个CPU使用率飙升至100%的线上故障,原因是在并发情况下使用HashMap导致死循环。当cpu使用率100%时,查看堆栈,发现程序都卡在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。HashMap结构HashMap 是我们经常会用到的集合类,JDK 1.7 之前底层使用了数组加链表的组合结构,如下图所示:HashMap通常会用一个指针数组...原创 2020-03-31 23:06:12 · 4579 阅读 · 7 评论 -
记一次通过优化日志解决高并发服务性能瓶颈问题
事故发现服务在生产环境中,由于同一时间段请求量过大,导致服务响应速度急剧下降。甚至会出现拒绝服务的问题,第一时间想到是机器性能问题,无法满足并发如此大的场景,需要进行扩容或者服务限流。经过扩容之后平稳了一个多月之后,又一次大量请求打进来的时候出现了此问题。这时才意识到开始从各个角度去排查问题。事故排查过程一个系统的吞吐量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。...原创 2020-03-18 17:50:24 · 36699 阅读 · 0 评论 -
Java动态代理相关简述
一、概念:Java动态代理的优势是实现无侵入式的代码扩展,也就是方法的增强;让你可以在不用修改源码的情况下,增强一些方法;在方法的前后你可以做你任何想做的事情(如Spring AOP、cglib等)。代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。(个人理解就是对调用目标的一种...原创 2020-01-20 11:53:39 · 421 阅读 · 0 评论 -
同步锁的优化思路及JDK对锁的一些优化
一、锁优化的思路和方法主要有以下5点:减少锁持有时间主要就是精准的确定需要加锁的模块,不需要加锁的代码模块分离在同步块之外。减小锁粒度将大对象(这个对象可能会被很多线程访问),拆成小对象,大大增加并行度,降低锁竞争。降低了锁的竞争,偏向锁,轻量级锁成功率才会提高。最最典型的减小锁粒度的案例就是ConcurrentHashMap。锁分离最常见的锁分离就是读写锁ReadWri...原创 2019-04-10 16:47:08 · 52543 阅读 · 0 评论 -
自旋锁、阻塞锁、可重入锁使用解析
自旋锁自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下:public class SpinLock { private AtomicReference<Thread> sign =new AtomicReference<>(); public void lock(){ Thread curre...原创 2019-03-29 16:39:46 · 55890 阅读 · 0 评论 -
常用判空工具
org.apache.commons.lang.ArrayUtils 【数组处理】org.springframework.util.StringUtils 【字符串处理】org.springframework.util.CollectionUtils 【集合处理】原创 2018-04-27 18:25:49 · 10400 阅读 · 0 评论 -
借助Spring和自定义注解完成多数据源配置(主从库示例)
前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备。由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多数据源。 后来发现其实基于spring来配置和使用多数据源还是比较简单的,因为spring框架已经预留了这样的接口可以方便数据源的切换。 先看一下spring获取数据源的源码: 可以看到Ab...转载 2018-09-17 11:18:03 · 13178 阅读 · 0 评论 -
JVM监控工具jstat使用详解
一、常用的JVM监控工具有如下几项:1、VisualVM:是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力。所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jstack,JConsole,这些工具与JDK的标准版本是一致的。2、jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的...原创 2019-01-02 15:36:12 · 12928 阅读 · 0 评论 -
JVM调优和垃圾回收相关参数整理
一、内存调优-Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)-Xms和-Xmx可以说是最流行的JVM参数,它们可以允许我们指定JVM的初始和最大堆内存大小。一般来说,这两个参数的数值单位是Byte,但同时它们也支持使用速记符号,比如“k”或者“K”代表“kilo”,“m”或者“M”代表“mega”,“g”或者“G”代表“gi...原创 2019-05-10 11:42:12 · 48081 阅读 · 0 评论 -
Java进程CPU占用率高的排查和常见解决方案
当系统出现卡顿或者应用程序的响应速度非常慢,就可能要考虑到服务其上排查一番,以下是我常用的排查流程:1、top:观察占用CPU或者MEN(内存)使用情况最高的进程,记录PID;TIP:(1)、“1” 显示出多个逻辑CPU使用情况;(2)、“X” 高亮显示CPU列,并排序,"Z"红色展示;(3)、“shift + &lt;” 或者 “shift + &gt;” 变更高亮的列;(4)、“F...原创 2019-01-10 17:13:15 · 62733 阅读 · 0 评论 -
ConcurrentLinkedQueue线程安全的队列源码解析
ConcurrentLinkedQueue简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现。ConcurrentLinkedQueue是一个基于链接节点的...原创 2019-03-28 19:43:17 · 51051 阅读 · 0 评论 -
Fork/Join - 并发框架源码解析
什么是Fork/Join框架Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+ … +100...转载 2019-03-28 22:01:47 · 54976 阅读 · 0 评论 -
基于Redis实现分布式锁剖析
之前的文章《分布式锁详解 - 分别利用Zookeeper和数据库实现分布式锁》,由于篇幅太长,又碰上加班时间不够充裕,所以没有把Redis的实现也顺带进去,特此做一些利用Redis实现分布式锁的分析。PS:让我做选择的话,分布式锁的选择还是更愿意选择利用Zookeeper去实现的。原因的话可以参考下面这张图:一、关于Redis分布式锁的基础知识1、缓存有效期:redis中的数据,不一定都...原创 2019-04-25 21:30:34 · 50166 阅读 · 4 评论 -
分布式锁详解 - 分别利用Zookeeper和数据库实现分布式锁
一、锁的相关描述1、锁的使用流程:首先参考一下JDK所实现的锁的通用接口Lock.java接口:/* * @since 1.5 * @author Doug Lea */public interface Lock { /** * 加锁 */ void lock(); /** * 锁中断 */ void l...原创 2019-04-23 15:10:16 · 7565 阅读 · 0 评论 -
JVM内存模型和GC算法分析
JVM运行时数据区JVM在运行过程中会把它所管理的内存划分成若干不同的数据区域。线程私有:程序计数器、虚拟机栈、本地方法栈 (主要存放指令)线程共享:堆、方法区 (主要存放数据)一、程序计数器程序计数器是用于存放下一条指令所在单元的地址的地方。我们可以随意拿一个class文件进行反编译,看看其结构。如下,JvmDemo.class文件:cafe babe 0000 0033...原创 2019-05-09 12:32:19 · 48964 阅读 · 0 评论 -
KMP、BM、Sunday、Horspool、strstr 字符串匹配算法介绍和性能比较
文章转自:https://blog.csdn.net/qq_33515733/article/details/81163135转载 2019-08-26 16:25:46 · 1095 阅读 · 0 评论 -
Java位运算符
一、Java中所支持的位运算符一共有7个符号说明&按位与。当两位同时为1时才返回1。|按位或。只要有一位为1即可返回1。~按位非(取反)。单目运算符,将操作数的每个位(包括符号位)全部取反。^“异或”运算。当两位相同时返回0,不同时返回1。<<左移运算符。>>右移运算符。>>>...原创 2019-09-17 22:04:52 · 377 阅读 · 0 评论 -
JAVA 内存泄露详解(示例及解决方式)
尝试了通过一张图片转载,效果还可以,就是原博主的代码格式太酷炫,亮瞎了。转载 2019-01-10 15:10:42 · 55120 阅读 · 0 评论 -
借助sharding-jdbc实现数据分片
1、引入依赖:<!-- 引入sharding-jdbc --> <dependency> <groupId>com.dangdang</groupId> <artifactId>sharding-jdbc-core</artifactId> ...原创 2018-12-28 12:28:20 · 12975 阅读 · 0 评论 -
sharding-jdbc读写分离的使用详解
一、不使用Spring1、引入Maven依赖<dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>${sharding-sphere.version...原创 2018-12-28 10:54:53 · 15348 阅读 · 6 评论 -
HashSet源码分析
HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。在HashSet中,元素都存到HashMap键值对的Key上面,而Value有一个统一的值private static final Object PRESENT = new Object();当有新值加入时,底层的HashMap会判断Key值是否存在。如果不存在,则插入新值,否则不插入并返回false。分析下...原创 2018-08-25 21:29:32 · 12465 阅读 · 0 评论 -
常用GC算法简述
常见GC算法:(1)引用计数法 Reference Counting: 对象添加一个引用计数器,每过一个引用计数器值就+1,少一个引用就-1。当它的引用变为0时,该对象就不能再被使用。它的实现简单,但是不能解决互相循环引用的问题。(2)根搜索算法 GC Roots Tracing 以一系列叫“GC Roots”的对象为起点开始向下搜索,走过的路径称为引用链(Refere...转载 2018-08-17 14:28:30 · 12986 阅读 · 0 评论 -
Java并发编程:线程池的使用
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecut...转载 2018-08-07 17:40:10 · 12546 阅读 · 1 评论 -
Java并发类库中线程池的使用及其工作原理
一、Java 并发类库提供的线程池有哪几种? 分别有什么特点?通常开发者都是利用 Executors 提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService 类型或者不同的初始参数。Executors 目前提供了 5 种不同的线程池创建配置: (1)、newCachedThreadPool(),它是一种用来处理大量短时间工作任务的线程池,具有几...原创 2018-08-01 12:26:31 · 12795 阅读 · 0 评论 -
并发包中的 Semaphore 的使用
Semaphore定义: 一个计数信号量。它通过控制一定数量的允许(permit)的方式,来达到限制通用资源访问的目的。你可以想象一下这个场景,在车站、机场等出租车时,当很多空出租车就位时,为防止过度拥挤,调度员指挥排队等待坐车的队伍一次进来 5 个人上车,等这 5 个人坐车出发,再放进去下一批,这和 Semaphore 的工作原理有些类似。使用示例:public class Semap...原创 2018-07-31 15:39:57 · 12709 阅读 · 0 评论 -
并发编程中的死锁定位排查
1、死锁定义: 死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。 示例图理解基本的死锁问题: 2、死锁实例:/** * 死锁测试 **/...原创 2018-07-31 10:40:01 · 5633 阅读 · 0 评论 -
Lombok的使用和常用注解使用示例
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。为何要使用Lombok我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要增加属性或者对某个属性进...转载 2018-06-11 19:21:17 · 18897 阅读 · 6 评论 -
Java使用代理Proxy访问网络
在Java的网络编程中,有时候内网服务器需要访问外网的网络资源,这时候就需要使用代理。设置代理(Proxy)可以有两种方式:1.通过设置系统属性(System.setPropery(String key, String value)的方式可以使用其中的http.proxyHost,http.proxyPort这两个属性,分别设置代理服务器地址和代理端口。123//在你发起Http请求之前设置一下属...原创 2018-05-06 22:42:29 · 30335 阅读 · 3 评论 -
Timer单线程的缺陷 用ScheduledExecutorService替代
1、Timer管理延时任务的缺陷a、以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷:下面看例子:Timer的源码:[java] view plain copypubl...原创 2018-05-17 10:25:55 · 5829 阅读 · 2 评论 -
通过数据表自动生成实体
import java.sql.*;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.*;import java.util.Date;/** * @author liaofh * @version 1.0 2016/5/20 * @modified liaofh ...原创 2018-05-03 16:04:53 · 5267 阅读 · 0 评论 -
深入理解Java的栈与堆栈
我想这篇足以让大家很清晰理解Java的栈和堆栈的区别。下面的是我收集了好多网友的资料加以整理的。Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存。 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,...转载 2018-05-09 10:47:37 · 8258 阅读 · 1 评论 -
Java中的多线程你只要看这一篇就够了
引如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。很多人都对其中的一些概念不够明确...转载 2018-04-12 10:21:51 · 5209 阅读 · 1 评论 -
深入理解Java中的volatile关键字
常用于保持内存可见性和防止指令重排序。保持内存可见性内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态。以下是一个简单的可变整数类:public class MutableInteger { private int value; public int get(){ return value; } ...原创 2018-08-29 22:13:54 · 12550 阅读 · 0 评论 -
深入理解ThreadLocal的原理和内存泄漏问题
ThreadLocal作用和原理分析:ThreadLocal主要为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。要理解ThreadLocal需要理解下面三个问题:①、每个线程的变量副本是存储在哪里的?(参考ThreadLocal的get()源码) 每个线程都有一个threadLocals成员,引用类型是ThreadLocalMap,以ThreadLocal和T...原创 2018-09-03 22:51:43 · 20546 阅读 · 14 评论 -
InputStream 源码分析
InputStream是所有输入字节流类的超类。下面是对InputStream源码对一些基本解读:public abstract class InputStream implements Closeable { private static final int SKIP_BUFFER_SIZE = 2048; private static byte[] skipBuffer...原创 2018-11-21 11:02:15 · 12921 阅读 · 1 评论 -
HashMap源码解析
源码博客相关博客写了那么多,突然想起来都没有写一篇我们日常开发中最常见的HashMap,今天补一下!HashMap简介:HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的...原创 2018-11-02 18:11:06 · 12572 阅读 · 0 评论