突然想到

毕业参加工作已有3年半时间了,活到现在一路过来都是波澜不惊。每当听到周围的人讲述那些不幸时,我总是发自肺腑地感觉到上天对我实在是太眷顾了。 我还是很喜欢程序员这份工作的,因为需要不断地学习,而我本身也是一个喜爱学习的人,学习总是容易让人获得一种满足感。 ...

2017年10月24日 · 1 分钟 · Bug1024

Linux性能调优工具

监控指标 load 特定事时间间隔内运行队列中的平均线程数 user time CPU执行用户进程所占用的时间 system time CPU在内核所花费的时间 nice time 系统在调整进程优先级的时候所花费的时间 idle time 系统空闲等待进程运行的时间 waiting time CPU在等待IO操作所花费的时间 hard irq time 系统处理硬件中断所占用的时间 soft irq time 系统处理软件中断所占用的时间 steal time 被强制等待虚拟机CPU的时间,占比较高表示当前虚拟机与该宿主其他虚拟机争用CPU频繁 磁盘剩余空间 使用df和du命令查看 网络traffic 使用sar命令查看 sar -n DEV 1 1 磁盘IO 使用iostat命令查看 iostat -d -k 内存使用 使用free命令查看 swap IO 使用vmstat命令查看 CPU 使用top或uptime看过去1分钟、5分钟、15分钟机器的负载。按照经验,若数值小于 0.7 * CPU核数,则系统工作正常 通过vmstat查看CPU上下文切换次数, 上下文切换的场景: 时间片用完,CPU正常调度下一个任务 被其它优先级更高的任务抢占 执行任务碰到I/O阻塞,挂起当前任务,切换到下一个任务 户代码主动挂起当前任务让出CPU 多任务抢占资源,由于没有抢到被挂起 硬件中断 Memory 操作系统角度,内存关注应用进程是否足够,可以使用free –m查看内存的使用情况。 通过top查看进程使用的虚拟内存VIRT和物理内存RES,根据公式VIRT = SWAP + RES可以推算出具体应用使用的交换分区(Swap)情况 I/O I/O包括磁盘I/O和网络 I/O,一般情况下磁盘更容易出现I/O瓶颈。 通过iostat可查看磁盘的读写情况,通过CPU的I/O wait可以看出磁盘I/O是否正常。 System Call strace常用来跟踪进程执行时的系统调用和所接收的信,常见选项: ...

2017年10月5日 · 3 分钟 · Bug1024

Java类加载

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这便是虚拟机的类加载机制。 加载 Loading 通过一个类的全限定名来获取定义此类的二进制字节流 将字节流所代表静态存储结果转化为方法区运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类各种数据的访问入口 验证 Verification 文件格式验证 元数据验证 字节码验证 符号引用验证 准备 Preparation 正式为类变量(被static修饰的变量)分配内存并初始化变量值 解析 Resolution 类或接口的解析 字段解析 类方法解析 接口方法解析 初始化 Initialization 真正开始执行字节码 使用 Using 卸载 Unloading

2017年10月3日 · 1 分钟 · Bug1024

jstat

垃圾回收堆的行为统计 # 每隔2000ms输出pid为1234的gc情况,一共输出20次 jstat -gc 1234 2000 20 # 同-gc,不过还会输出Java堆各区域使用到的最大、最小空间 jstat -gccapacity 1234 # 同-gc,不过输出的是已使用空间占总空间的百分比 jstat -gcutil 1234 # 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因 jstat -gccause 1234 # 统计新生代的行为 jstat -gcnew 1234 # 新生代与其相应的内存空间的统计 jstat -gcnewcapacity 1234 C即Capacity 总容量,U即Used 已使用的容量 S0C : survivor0区的总容量 S1C : survivor1区的总容量 S0U : survivor0区已使用的容量 S1U : survivor1区已使用的容量 EC : Eden区的总容量 EU : Eden区已使用的容量 OC : Old区的总容量 OU : Old区已使用的容量 PC 当前perm的容量 (KB) PU perm的使用 (KB) YGC : 新生代垃圾回收次数 YGCT : 新生代垃圾回收时间 FGC : 老年代垃圾回收次数 FGCT : 老年代垃圾回收时间 GCT : 垃圾回收总消耗时间 GC日志 [GC [<收集器>: <Young区在GC前占的内存> -> <Young区在GC后占用的内存>(总大小) <Young区局部收集时JVM暂停处理的时间> secs] <JVM Heap在GC前占的内存> -> <JVM Heap在GC后占用的内存>(), <GC过程中JVM暂停处理的总时间>]] 如果 Young区在GC后占用的内存 - Young区在GC后占用的内存 = JVM Heap在GC后占用的内存 - JVM Heap在GC前的内存,则表示GC对象完全被回收,没有对象进入Old区或者Perm区。如果等号前面的值大雨后面的值,那么差值就是这次回收对象进入Old或者Perm区的大小。如果随着时间延长,JVM Heap在GC后占用的内存一直增长,而且Full GC频繁,那么可能就是内存泄露了。 ...

2017年9月30日 · 2 分钟 · Bug1024

Java线程池

Java 线程池关键属性 corePoolSize 到 maximumPoolSize 之间的线程会被回收,当然 corePoolSize 的线程也可以通过设置而得到回收(allowCoreThreadTimeOut(true))。 workQueue 用于存放任务,添加任务的时候,如果当前线程数超过了 corePoolSize,那么往该队列中插入任务,线程池中的线程会负责到队列中拉取任务。 keepAliveTime 用于设置空闲时间,如果线程数超出了 corePoolSize,并且有些线程的空闲时间超过了这个值,会执行关闭这些线程的操作 rejectedExecutionHandler 用于处理当线程池不能执行此任务时的情况,默认有抛出 RejectedExecutionException 异常、忽略任务、使用提交任务的线程来执行此任务和将队列中等待最久的任务删除,然后提交此任务这四种策略,默认为抛出异常。 Java 线程池中的线程创建时机 如果当前线程数少于 corePoolSize,那么提交任务的时候创建一个新的线程,并由这个线程执行这个任务; 如果当前线程数已经达到 corePoolSize,那么将提交的任务添加到队列中,等待线程池中的线程去队列中取任务; 如果队列已满,那么创建新的线程来执行任务,需要保证池中的线程数不会超过 maximumPoolSize,如果此时线程数超过了 maximumPoolSize,那么执行拒绝策略。 ...

2017年9月6日 · 2 分钟 · Bug1024

负载均衡

负载均衡分类 二层负载均衡 对外依然提供一个VIP,集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。 ...

2017年8月27日 · 2 分钟 · Bug1024

IO

文件I/O常用函数 open 打开或创建一个文件 create 创建一个新文件 read 从打开文件中读取数据 write 向打开文件中写入数据 lseek 显示设置文件的偏移量 close 关闭一个文件 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用,它是一个非负数,打开或新建文件时内核向进程返回一个文件描述符,当读写一个文件时,使用oepn或create返回文件描述符标识文件,并将其作为参数传给read或write。 ...

2017年8月12日 · 2 分钟 · Bug1024

MySQL InnoDB

MySQL实例 在Unix上,启动一个MySQL实例通常会产生两个进程,mysqld 就是真正的数据库服务守护进程,而mysqld_safe是一个用于检查和设置mysqld启动的控制程序,它负责监控于重启。 ...

2017年8月8日 · 4 分钟 · Bug1024

Dubbo

简介 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 调用关系 服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 负载均衡 Random LoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率。 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

2017年8月3日 · 2 分钟 · Bug1024

时间管理

时间规划 工作中要注意做好时间规划,也要做好任务记录,遇到临时任务,先记录下来形成TodoList,并确定deadline,并非所有任务都要立刻跟进,以免打扰手工正在进行的工作,造成频繁切换任务,影响效率。每天早上来,花5分钟思考整理当天的工作计划。 ...

2017年7月5日 · 1 分钟 · Bug1024