- 博客(26)
- 问答 (1)
- 收藏
- 关注
原创 Spring @Scheduled线程模型探究 - 改为多线程
通过上一节分析源码我们知道,执行任务的是TaskScheduler的实现类,在ScheduledAnnotationBeanPostProcessor#finishRegistration()方法中会设置TaskScheduler。首先如果注册器ScheduledTaskRegistrar中的scheduler成员为空才会从Spring上下文中加载我们只需要为ScheduledTaskReg...
2020-03-14 20:19:48
475
1
原创 Netty -从ServerBootstrap入手分析内部实现
public class DiscardServer { private int port; public DiscardServer(int port) { this.port = port; } public void run() throws Exception{ EventLoopGroup bossGroup = new...
2020-03-09 00:41:03
230
原创 Spring @Scheduled线程模型探究 - 源码追踪
接上一篇我们来分析一下 @Scheduled 这个定时器的注解实现首先我看下@Scheduled注解的定义package org.springframework.scheduling.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java....
2020-02-22 19:04:36
339
原创 Spring @Scheduled线程模型探究 - 发现问题
最近工程中发现一个奇怪的问题,简单代码逻辑如下所示:@EnableScheduling@Componentpublic class SimpleImplement { private static final Logger LOG = LoggerFactory.getLogger(SimpleImplement.class); private volatile List&...
2020-02-22 14:52:45
271
转载 Maven3种打包方式之一maven-assembly-plugin的使用
在Maven中,主要有3个插件可以用来打包:maven-jar-plugin,默认的打包插件,用来打普通的project JAR包;maven-shade-plugin,用来打可执行JAR包,也就是所谓的fat JAR包;maven-assembly-plugin,支持自定义的打包结构,也可以定制依赖项等。我们日常使用的以maven-assembly-plugin为最多,因为大数据项目...
2019-12-03 16:45:07
382
原创 Linux 安装 FireFox 浏览器
该文档为FireFox在Linux系统上的安装说明文档,适用于CentOS6.4安装依赖准备安装包 atk-2.4.0.tar.xz cairo-1.12.2.tar.xz gdk-pixbuf-2.26.3.tar.xz glib-2.32.4.tar.xz gtk+-3.4.4.tar.xz pango-1.30.1.tar.xz pixman-0.26.2.tar.x...
2018-05-18 15:27:06
4609
原创 控制三个线程交替打印ABC
package me.zyc.thread.test;import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject;import java.util.concurrent.locks.ReentrantLock;public class LoopRunByOrder { private s
2018-01-10 17:38:59
475
转载 Java对象内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头 HotSpot虚拟机的对象头包括两部分信息:第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的
2017-11-13 21:30:50
238
原创 JDK源码走读之ReentrantLock
ReentrantLock的功能几乎等同于Synchronized,在分析源码之前,我们首先来明确一下ReentrantLock要实现的功能,这样才能做到有的放矢。控制线程执行顺序。当线程获取锁进入Synchronized代码块(获取监视器),其余线程必须等待该线程执行完毕,才能继续执行该代码块。提供线程通信功能。Synchronized关键字支持在其代码块中使用await、notify、
2017-11-11 17:30:26
404
转载 如何聪明地使用锁
竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要。如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的绝大部分损耗。如果一个锁被多个线程使用过,但是在任意时刻,都只有一个线程尝试获取锁,那么它的开销要大一些。我们将以上两种锁称为非竞争锁。而对性能影响最严重的情况出现在多个线程同时尝试获取锁时。这种情况是 JVM 无法优化的,而且通常会发生从用户
2017-11-10 16:07:12
1808
原创 JDK源码走读之深入理解线程池(ThreadPoolExecutor)
Java线程池提供了一个框架来统一管理线程,通过把提交任务和执行任务解耦,使开发者无需关心线程的运行状态,只要把任务提交给线程池既可。使用线程池有以下好处: 1. 减少在创建和销毁线程上所花的时间以及系统资源的开销 2. 避免创建过多的线程导致系统资源过度消耗、系统执行效率低下线程池可以通过工厂类Executors创建,大致分为以下几种: 1. newFixedThreadPool(int
2017-10-28 18:28:58
338
原创 深入源码剖析Thread.join实现
java.lang.Thread类提供一个静态方法join可以阻塞主线程(调用join方法的线程),直到当前线程执行完。用法如下: join会保证t2在t1线程执行完退出之后再执行,程序执行结果总是如下 定义实现该方法掉用了join(0)方法, 我们跟进查看具体实现。注意这里是一个静态方法加了同步锁,锁的是this,也就是当前类实例。我们知道在线程获取了锁以后再执行wait方法,会让线程释放掉锁
2017-10-27 23:21:44
578
2
原创 JDK源码走读之LinkedList
LinkedList本质是一个双端链表,双端链表区别于双向链表,双向链表之链表的首位相连,而双端链表则分别持有链表头尾两个节点,访问时既可以从头开始,也可以从尾部开始。链表结构 定义LinkedList实现了List、Dequet接口使它兼具二者的特性,既支持集合的添加删除操作,又支持队列的出队入队操作public class LinkedList<E> extends AbstractSeque
2017-10-24 17:00:10
230
原创 JDK源码走读之ArrayList
ArrayList其实就是动态数据,它封装了初始化、添加、删除、遍历等操作,并加入了泛型支持,下面我们从几个方面来分析一下ArrayList的实现。定义public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
2017-10-23 17:18:58
237
原创 如何优雅的停止服务(ShutdownHook)
JDK提供了Runtime.addShutdownHook(Thread hook)方法用来注册一个钩子(线程),在Java程序退出时会调用这个钩子来清理现场。这个钩子会在以下场景中被调用: 1. 程序正常退出 2. 使用System.exit() 3. 终端使用Ctrl+C触发的中断 4. 系统关闭 5. OutOfMemory宕机 6. 使用Kill pid命令干掉进程(
2017-10-16 15:24:09
3358
原创 死锁分析
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。发生死锁需要满足4个条件: 1. 互斥条件:一个资源每次只能被一个进程使用。 2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 4. 循环等待条件:若干进程之间形成一种头尾相接
2017-09-28 14:28:13
380
原创 elasticsearch基本参数配置
1、 JVM参数配置配置合理的jvm参数,能够避免OOM(OutOfMemory),提高系统响应时间(减小GC停顿)。1.1、 heap-size-Xms32G -Xms32G官方建议设置heap大小为操作系统的一半且最大不超过32G。1)Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同
2017-08-07 15:25:25
523
原创 elasticsearch(5.2.0)安装文档
1、 集群安装以三个节点集群安装为例,使用elasticsearch-5.2.0进行安装。1.1、 硬件要求系统要求:CentOS 6.x/CentOS7.xLinux内核要求:Linux2.6+(不开启system call filters)Linux3.5+(开启system call filters)其他要求:系统文件打开数最少为63356vm.max_m
2017-08-07 11:42:45
464
转载 elasticsearch内存分配设置详解
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了。如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题。 这里有两种方式修改Elasticsearch的堆内存(下面就说内存好了),最简单的一个方法就是指定ES_HEAP_SIZE环境变量。服务进程在启动时候会读取这个变量,并相应的设置堆的大小。设置命令如下:export ES
2017-08-07 10:15:34
1533
转载 GC日志分析
首先,给出一个日志输出的例子:参数设置为:-XX:+PrintGCDetails -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8 -XX:NewSize=10M -XX:MaxNewSize=10M参数解释:-XX:+PrintGCDetails 启用日志-XX:-UseAdaptiveSizePolicy 禁用
2017-06-30 15:15:36
263
原创 记一次OOM(GC overhead limit exceeded)异常
java.lang.OutOfMemoryError异常并不一定意味着内存溢出
2017-06-28 16:59:27
1322
转载 java 线程的几种状态
java 线程的几种状态java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:NEW 状态是指线程刚创建, 尚未启动RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等BLOCKED 这
2017-06-08 11:30:08
379
原创 spark executor
Spark core设置Core是指CPU计算核心,这个在spark集群中很重要,为集群配置更多的Core能意味集群运算能力更强,但这也不是绝对的。下面主要来看两个参数: spark.cores.max 这个参数是指运行一个application最大分配的core个数,设置这个参数,spark会尽可能的申请足够多的core来运行application。 Spark.
2017-06-06 18:06:11
5873
转载 RDD:基于内存的集群计算容错抽象
该论文来自Berkeley实验室,英文标题为:Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing。下面的翻译,我是基于科学网翻译基础上进行优化、修改、补充,这篇译文翻译得很不错。在此基础上,我增加了来自英文原文的图和表格数据,以及译文中缺少的未翻译的部分。如果翻
2017-03-29 14:07:29
449
转载 讲个故事:一个SparkSQL作业的一生
Spark是时下很火的计算框架,由UC Berkeley AMP Lab研发,并由原班人马创建的Databricks负责商业化相关事务。而SparkSQL则是Spark之上搭建的SQL解决方案,主打交互查询场景。人人都说Spark/SparkSQL快,各种Benchmark满天飞,但是到底Spark/SparkSQL快么,或者快在哪里,似乎很少有人说得清。因为Spark是基于内
2017-03-28 17:28:06
573
空空如也
Redis 如何通过aof文件恢复数据
2017-10-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人