自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

04stone37

日积月累

  • 博客(540)
  • 收藏
  • 关注

原创 Groovy脚本热更新

背景: Java应用定时调用脚本,采集系统监控信息。调用方式1:边解释边执行  如下图所示,当监听到脚本变化后,只需要在内存中更新脚本内容即可,下次执行eval时就能执行最新的脚本了。 调用方式2:一次编译,多次执行  如下图所示,当监听到脚本变化后,需要重新编译脚本,然后缓存CompiledScript,定时执行CompiledScript.eval()。

2017-10-30 17:29:52 1888

原创 Java对脚本语言的支持

Java 脚本 API  JDK提供了一套标准接口,方便Java应用与各种脚本引擎的交互。javax.script 包定义了这些接口,即 Java 脚本编程 API。脚本引擎  脚本引擎就是脚本解释器,负责运行脚本,获取运行结果。JDK提供了脚本引擎的接口ScriptEngine ,Java 应用程序通过这个接口调用脚本引擎运行脚本程序,并将运行结果返回给虚拟机。发现和创建脚本引擎  JDK提供Sc

2017-10-30 11:53:50 3084

原创 JMX基本使用示例

public interface HelloMBean { //属性 public String getName(); public void setName(String name); //方法 public void sayHello(); public int add(int x, int y);}public class Hello imple

2017-10-27 14:30:08 255

原创 监控中心方案设计

场景1:公司内部的机器有数万台,需要对每台机器的运行情况进行监控告警,包括系统监控、JVM监控及JDBC监控等,要求尽可能让应用无感知,且易升级维护。 部署方案 启动: StartAgent作为系统基础环境,机器分配之后就启动。应用启动之后与StartAgent建立连接传输JVM、JDBC等监控信息,StartAgent本身采集系统监控信息,然后将所有的监控汇总传送到监控中心。 升级:如果是D

2017-10-26 20:58:36 1824

转载 Linux之文件读写过程

转载:http://www.cnblogs.com/huxiao-tee/p/4657851.html 读文件流程进程调用库函数向内核发起读文件请求;内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;调用该文件可用的系统调用函数read();read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;在inode中,通过

2017-10-26 16:05:28 4630

原创 Java线程阻塞与恢复

任务中有while(true)处理  任务中有while(true)时,interrupt或者cancel是无效的,推荐做法如下:public void run() { while (!Thread.interrupted()) { // TODO }}

2017-10-26 11:39:50 459

原创 Java线程中断interrupt

Java线程中断的本质  本质: JVM设置线程的中断标记,不同于操作系统的抢占式中断;Java线程中断作用中断处于WAITING、TIMED_WAITING状态的线程,使其抛出中断异常;设置中断标记位,应用程序通过判断该标记为取消任务、线程终止等;Thread.interrupt() VS Future.cancel()  Future.cancel()底层会调用Thread.interru

2017-10-26 10:40:15 310

原创 Linux之iostat命令详解

功能  查看磁盘IO情况,只能查看系统整体的IO消耗,无法查看每个进程的IO消耗(iotop命令);语法  iostat [选项][参数]常用选项:-k:显示状态以千字节每秒为单位,而不使用块每秒; -m:显示状态以兆字节每秒为单位;-d:显示扩展参数;参数:间隔时间:每次报告的间隔时间(秒);次数:显示报告的次数;IO详情  rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会

2017-10-25 10:00:29 525

原创 CPU使用率 VS Load

定义CPU使用率:一段时间内,CPU执行任务的时间与总时间的比率,从时间维度反映CPU资源使用情况; Load:一段时间内,CPU正在执行的任务以及处于“uninterruptable sleep”状态(IO阻塞导致)任务数量的平均值; The load average is calculated as the average number of runnable or running tas

2017-10-24 20:55:03 361

原创 Linux之top命令详解

CPU各项含义  cpu_st:虚拟cpu等待实际cpu时间占比;   cpu_si:软中断占用CPU的百分比;   cpu_hi:硬中断占用CPU的百分比 ;   cpu_wa:等待输入输出的CPU时间百分比;   cpu_id:空闲CPU百分比;   cpu_ni:用户进程空间内改变过优先级的进程占用CPU百分比 ;   cpu_sy:内核空间占用CPU百分比;   cpu_us

2017-10-24 15:37:40 287

原创 JVM监控

JVM监控项JVM监控原理  JDK的java.lang.management包提供了管理接口,用于监控管理JVM及操作系统。如上图所示,JVM有众多监控项,根据JMX规范,每个监控项用MXBean表示,应用程序通过访问MXBean接口获取监控数据。访问方式分为两种:1. 直接访问   通过静态工厂方法直接获取对应的MXBean,然后获取监控数据;2. 间接访问   通过MBeanServe

2017-10-24 11:37:43 2143

原创 JDK7之Try-with-resources

Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源。Try-catch-finally传统的Try-catch-finally问题在于以下两点:需要在finally中显式关闭资源;如果finally语句块关闭资源抛出异常时可能影响其他资源的关闭; 示例代码如下:public class TryCatchFinall

2017-10-23 17:35:46 265

原创 JDK8新特性之Lambda表达式

定义  Lambda表达式就是匿名方法;语法(parameters) -> expression或(parameters) ->{ statements; }以下是lambda表达式的重要特征:可选类型声明:不需要声明参数类型,编译器可以统一识别参数值;可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号;可选的大括号:如果主体包含了一个语句,就不需要使用大括号;可选的返回

2017-10-23 15:09:33 222

原创 JDK8新特性之函数式接口

定义:一个接口,如果只有一个显式声明的抽象方法(除了隐含的Object对象的public方法),那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。 JDK 8之前已有的函数式接口: java.lang.Runnable、java.util.concurrent.Callable、java.util.Comparator等; 新定义的函数式接口: jav

2017-10-23 14:34:11 246

原创 JMX之Mbean

标准MBean要求1:接口名为***MBean,实现类名为***,且接口和实现类必须在同一个包下; 要求2:接口中方法的入参和返回值只能为基本类型;public interface HelloMBean { public void sayHello(); public int add(int x, int y);}public class Hello implements Hel

2017-10-20 19:03:20 288

原创 Java基础之JMX

JMX简介  JMX是Java Management Extensions 的简写,即Java管理扩展。JMX是Java官方提供的一套用于监控Java程序和JVM运行时状态的标准API。JMX的监控内容可以分为三方面:系统监控:如CPU、LOAD、内存等;JVM监控:如堆内存、FGC、类加载等;应用监控:如任务堆积、数据对账等;JMX技术架构  JMX的技术架构分为3层:检测层、代理层和远程

2017-10-20 16:52:00 426

原创 分布式环境下全局唯一ID的生成方案

方案1:UUID优点:能够非常简便地保证分布式环境中的唯一性; 缺点:长度过长,包含32个字符和4个短线;没有业务含义,不便于问题排查;方案2:数据库主键单库:主键id 优点: id连续、唯一,且id大小反应先后顺序; 缺点:分布式应用需要共享该单表,且单表的存储量有上限;

2017-10-19 21:06:00 480

原创 Curator之Leader选举

基于LeaderSelector实现  当客户端成为Leader时,采用异步回调的方式调用takeLeadership,执行相应的逻辑;   优点如下:     1. 异步非阻塞;     2. 对于Leadership控制很灵活;     3. Leadership释放后可以重新排队竞争Leader;     4. 连接出现异常时,原先Leader正在执行的逻辑会被取消,防止出现并发;/

2017-10-19 18:47:23 425

原创 Java基础之带有抽象方法的枚举类

public enum ConnectionState { //建立连接 CONNECTED { public boolean isConnected() { return true; } }, //连接断开 LOST { public boolean isConnected() {

2017-10-19 10:45:37 816

原创 断线重连机制

Zookeeper的客户端具有自动重连机制,当出现网络异常时,客户端会自动重连直到与集群中的某台机器连接成功,连接过程如下图所示: 1. 网络异常情况包括网络闪断、ZK服务器宕机等情况,这会导致连接断开CONNECTION_LOSS,此时客户端会收到事件None-Disconnected; 2. 如果在SessionTimeout时间内连接成功,则客户端收到事件None-SynConnect

2017-10-18 17:03:09 3842

原创 服务器地址列表

客户端连接ZK集群时,如何从服务器列表中选择?  利用Collections.shuffle()将服务器列表随机打乱,组成环形数组,然后依次选择;问题1:无法实现“同机房优先策略”  背景:为了提高应用的稳定性和容灾能力,服务器都是多机房甚至异地机房部署。但多机房造成的问题就是“不同机房间延时不同”,目前方案是采用“同机房优先”的策略:服务的消费者优先消费同一个机房中提供的服务。   ZK集群为了

2017-10-18 11:51:48 431

原创 Zookeeper之Session

基本属性sessionId:会话ID,特点是全局唯一,保证sessionId全局唯一的基本思想是机器标识+随机数(时间戳),机器标识区分集群中不同的机器,同一台机器内的session可以用随机数、内存地址、计数器等多种手段来区分,一般会结合业务场景赋予一定的业务语义来使用;timeout:会话超时时间(时间段),当会话超时失效后,与会话绑定的数据、其创建的所有临时节点和watcher都会被...

2017-10-17 17:02:58 642

原创 客户端与服务端交互流程

发起连接请求与服务端建立连接,ZK集群分配一个Session ID给客户端;(连接建立成功后session被创建)客户端周期性发送心跳保持Session的有效性,若ZK集群在指定时间内(Session timeout)没收到心跳则认为Session失效(session创建的临时节点以及watches都会被删除);客户端发起读写znode节点的请求;客户端主动断开与ZK集群的连接,或者Sessi

2017-10-17 10:03:53 1828

原创 数据读写流程

特点:单点(master节点)写入,多点(任意节点)读取; 读取流程:客户端发送读请求,与客户端建立连接的zk节点直接读取自己的数据,然后返回; 写入流程:客户端发送写请求,与客户端建立连接的zk节点首先将写请求转发给master节点,然后master节点再广播给集群中的其它节点,只有当大部分(Quorum参数,启动时配置)节点写入成功后当前写请求才能算作写入成功,然后返回给客户端;

2017-10-16 19:56:22 835

原创 Linux之OOM-killer

查看哪个进程被杀死: grep -i ‘killed process’ /var/log/messages 或者 dmesg | grep -i ‘killed process’ dmesg vs /var/log/messages   两者都是用于记录系统消息的,dmesg是内存缓存的消息,超过大小会丢弃,所以要及时查看;messages里是syslog-ng写进去的,写的内容依赖于其配置/e

2017-10-16 10:44:18 3663

转载 Zookeeper开源客户端ZKClient和Curator简介

Zookeeper客户端提供了基本的操作,比如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。但对于开发人员来说,Zookeeper提供的基本操纵还是有一些不足之处。本篇博客就聊聊这些不足之处和两款开源框架ZKClient和Curator。Zookeeper API不足之处(1)Zookeeper的Watcher是一次性的,每次触发之后都需要重新进行注册; (2)Sess

2017-10-14 14:46:42 237

原创 分布式锁

基于Curator的分布式锁实现

2017-10-13 10:28:58 142

原创 客户端Master动态选举

Master动态选举:当前master挂掉后,集群中的机器能够自动选举下一个master。 背景知识:临时节点:一旦创建临时节点的会话失效,该节点会被ZK主动删除;ZK强一致性:若有多个客户端同时请求创建同一个节点,最终只有一个客户端能够创建成功;方案:每个客户端启动时在同一个父节点下创建相同的临时节点,同时注册该子节点的变更watcher,用于监控当前master是否存活,一旦发现当前ma

2017-10-12 15:18:47 311

原创 Mysql-事务隔离级别

Repeatable Read:并发事务情况下,同一事务内能读取到相同数据,不收其它事务的影响; Read Committed:并发事务情况下,事务A可以读取到事务B已提交的数据; 举例:   场景如上图所示,当线程2执行到2处时,若事务隔离级别为Read Committed,则此时subid为11,即事务2能够看到事务1已经提交的数据;若事务隔离级别为Repeatable Read,则此

2017-10-11 14:58:41 199

原创 SELECT..FOR UPDATE和LOCK IN SHARE MODE替代方案

说明  SELECT..FOR UPDATE是互斥锁,LOCK IN SHARE MODE是读写锁,都是为了解决“select+update并发更新的问题”,但是存在行锁升级为表锁的风险,影响并发,不建议使用。Innodb行锁原理  InnoDB行锁是通过给索引上的索引项加锁来实现的,这意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!但是,...

2017-10-11 11:06:01 1924

原创 Mysql-锁相关知识

锁的分类:    按照是否共享分类:共享锁和排它锁(互斥锁);    按照锁范围分类:表锁和行锁;共享锁和排它锁:对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于一般的Select语句,InnoDB不加任何锁,如果需要锁的话可以通过SQL语句显示加锁:   共享锁:SELECT … LOCK IN SHARE MODE;   排他锁:SEL

2017-10-10 17:13:57 213

原创 Mysql-常用命令

LOCK TABLES:锁表 UNLOCK TABLES:释放表锁 SHOW OPEN TABLES WHERE In_use > 0:查看正在被锁的表

2017-10-10 16:27:39 162

原创 Java基础之动态编译

动态编译:运行期间编译.java文件,执行.class文件,JDK6开始已经支持动态编译了。 优点:可以动态编译执行类 缺点: 1. 性能不高   动态编译毕竟需要一个编译过程,与静态编译相比多了一个执行环节,因此在高性能项目中不要使用动态编译。不过,如果是在工具类项目中它则可以很好地发挥其优越性,比如在Eclipse工具中写一个插件,就可以很好地使用动态编译,不用重启即可实现运行、调试

2017-09-30 14:49:11 203

原创 Java基础之“get-if-absent-compute”

平时开发中经常遇到这样的场景:根据key从map中查询是否有对应的value,若存在则返回,不存在则创建新值返回,要求多线程安全。方案1:利用putIfAbsent实现 特点:多线程安全、能保证key对应value的数据一致性; 缺点:高并发场景下回多次创建新的对象;方案2:利用Guava Cache实现特点:多线程安全、能保证key对应value的数据一致性,且能保证对象只被创建一次;

2017-09-29 18:55:49 814

原创 Java基础之关于几种单例实现的思考

方案1:利用CAS原子性实现单例   该实现方案存在问题:假设线程1获得锁将0置为1,还未创建对象但是CPU时间耗尽,此时线程2无法获取锁直接返回null。根本原因是:原子变量只能保证CAS操作是原子性的,但是后面的代码块无法保证。方案2:使用双重锁检查实现单例   synchronized特点是每次只允许单个线程进入,其它线程阻塞直到占有锁的线程执行完语句块中的语句,这样做的好处是阻塞线程会等

2017-09-29 10:27:59 267

原创 Java进程突然消失

几种可能的原因:Java应用程序的问题:发生OOM导致进程Crash;JVM出错:JVM或JDK自身的Bug导致进程Crash;被操作系统OOM-Killer;原因1:JVM发生OOM   最常见的是发生堆内存异常“java.lang.OutOfMemoryError: Java heap space”,排查步骤如下:查看JVM参数 -XX:+HeapDumpOnOutOfMemoryEr

2017-09-24 11:33:38 6835

原创 JVM之热部署与热加载

预备知识热部署: 就是容器在运行的情况下重新部署整个项目。在这种情况下一般整个内存会清空,、重新加载,但这种方式可能会造成sessin丢失等情况。 热加载: 就是容器状态在运行的情况下重新加载改变编译后的类。在这种情况下内存不会清空、sessin不会丢失,但容易造成内存溢出,或者找不到方法。   热部署与热加载技术想解决的问题是应用升级更新时对业务的影响,分布式集群技术可以允许机器分批重启而不影

2017-09-16 17:40:54 1040

原创 类加载机制之ContextClassLoader

基础知识点知识点1: 每个ClassLoader都只能加载自己所绑定目录下的资源; 知识点2: 加载资源时的ClassLoader可以有多种选择:    1. 系统类加载器SystemClassLoader,可通过ClassLoader.getSystemClassLoader()获得;    2. 当前ClassLoader:加载了当前类的ClassLoader;    3. 线程...

2017-09-16 16:20:19 2715

原创 类加载机制之Class.forName()

  Class.forName()是Java程序运行时加载类的默认方法,如下图所示: Class.forName()方法解析Class.forName(String className):使用调用Class.forName()方法的类的类加载器加载加载类,如下图所示: Class.forName(String name, boolean initialize,ClassLoad...

2017-09-15 11:58:43 3715

原创 类加载机制之ClassLoader

基础知识JVM如何区分不同类型? JVM通过类全名+加载该类的ClassLoader区分的;同一个ClassLoader能够重复加载同一个类?同一个ClassLoader不允许多次加载一个类的,否则会报java.lang.LinkageError;JVM只提供了加载类的方法,但并没有提供卸载的方法(主动回收,可预期),当发生FGC时才被回收(被动回收,不可预期);ClassLo...

2017-09-15 10:22:09 592

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除