城的灯

杨果的博客


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索
close
城的灯

线程转储分析

发表于 2015-04-01 | 分类于 技术

最近好几个同事都向我问起过java线程转储方面的知识,都是些常见的问题,如:系统负载过高,系统吞吐率降低,系统挂起等等。这些问题的定位和解决都离不开线程转储,因为这些问题在测试环境复现的难度较大,只有在生产环境进行ThreadDump,才能快速定位问题。

线程状态

在具体分析线程转储数据之前,我们首先要明确线程的状态。java.lang.Thread.State枚举类中定义了如下几种类型:

  1. NEW:线程创建尚未启动。
  2. RUNNABLE:包括操作系统线程状态中的Ready和Running,可能在等待时间片或者正在执行。
  3. BLOCKED:线程被阻塞。
  4. WAITING:不会分配CPU执行时间,直到别的线程显式的唤醒,否则无限期等待。LockSupport.park(),没有设置Timeout参数的Object.wait()和Thread.join(),会导致此现象。
  5. TIMED_WAITING:不会分配CPU执行时间,直到系统自动唤醒,不需要别的线程显示唤醒。Thread.sleep(),LockSupport.parkNanos(),LockSupport.parkUntil(),设置了超时时间的Object.wait()和Thread.join(),会让线程进入有限期等待。
  6. TERMINATED:线程执行结束。
阅读全文 »
城的灯

高性能编程术语

发表于 2015-03-10 | 分类于 技术

本篇文章,意在阐述并发,并行,分布式等高性能编程中的术语。请注意,本篇文章说将术语并没有标准定义,只是个人理解与定义。

Asynchronous vs. Synchronous

一个方法的调用者不能做任何事情,直到该方法执行完成返回结果或者抛出异常,那么该方法就是同步的。与其相反,方法的调用者能够继续处理有限步骤的逻辑,直到被告知(Callback,Future,Message)该方法执行完成,然后调用者再回头处理调用结果,那个该方法就是异步的。

同步API可以通过阻塞来实现,但这也不是必须的。一个CPU密集型的任务可能会导致阻塞行为。在一般情况下,我们最好使用异步API,因为这样可以保证系统在非CPU密集导致的阻塞时,可以执行别的任务。说到异步编程,就不得不说Actor,它天生就是异步的,Actor能够处理别的任务,直到收到任务完成的message,而不必等待方法调用的实际交付。

阅读全文 »
城的灯

Squirrel使用

发表于 2015-02-01 | 分类于 技术

java状态机squirrel的初级用法

Get Starting

squirrel-foundation既支持流式API又支持声明式创建状态机,并且还允许用户以一种简单方式定义操作方法。

  • StateMachine接口需要以下4种泛型参数。
    • T代表实现的状态机类型。
    • S代表实现的状态类型。
    • E代表实现的事件类型。
    • C代表实现的外部上下文类型。

State Machine Builder

* State machine builder用来定义状态机。StateMachineBuilder能够通过StateMachineBuilderFactory来创建。
* StateMachineBuilder由`*TransitionBuilder (InternalTransitionBuilder / LocalTransitionBuilder / ExternalTransitionBuilder)`(用于状态之间转换)和`EntryExitActionBuilder`(用于构建操作入口或出口)的组成。
* Internal state(内部状态)会被隐式创建,在transition或者state action创建的时候。
* 所有的状态机实例会被同一个状态机builder创建,该builder共享一份结构化的数据,从而优化内存的使用。
* 状态机builder在生成状态机的时候使用lazy模式。当builder创建第一个状态机实例时,包含时间消耗的状态机定义才会被创建。但是状态机定义生成之后,接下来的状态机创建将会非常快。一句话,状态机builder应该尽量重用。
阅读全文 »
城的灯

编译原理之Javacc使用

发表于 2014-12-13 | 分类于 技术

最近由于需要解析Eterm指令结果,对于这种不遵循标准格式(XML/JSON/HTML)的文本,我又不想大量的堆叠大量的正则表达式,因此借助Javacc来解决我的问题。

编译知识

对于码农来说,应该不需要再解释编译这回事了。一般我们将语言分为编译型语言和解释型语言,但是不管是哪种语言,都少不了词法分析、语法分析。


词法分析(lexing)

词法分析就是将文本分解成token,token就是具有特殊含义的原子单位,如果语言的保留字、标点符号、数字、字符串,当然包含空白等等,只不过有些如空白会在词法分析时忽略掉。

阅读全文 »
城的灯

Tigase集群方案及配置说明

发表于 2014-09-20 | 分类于 技术

该文档主要是描述Tigase整体架构和一些配置说明,整体架构我们采用config-type=—-genconfig-def的server加config-type=—-genconfig-comp的外部component。同时还会对SM的插件和错误代码进行说明,方便大家在开发及配置时参考。由于外部component较多,此处选择了较为复杂的MUC作为配置案例。pubsub,proxy,message-archive,msn,自己开发的componet,配置都的思想都基本一样。但是限于本人认识有限,如果有任何错误或者歧义,请大家及时指正。

Server(c2s+s2s+sm+ext2s)集群+MUC(comp)集群

架构图

tigase架构图

阅读全文 »
城的灯

Tigase Watchdog分析及优化

发表于 2014-09-10 | 分类于 技术

TCP链接回收是所有长连接服务器必须要面对的问题,我前面的有些文章其实已经涉及到该方面的知识。但是本篇文章主要分析和讲述tigase在移动网络中,链接的回收原理及优化方案。

心跳

心跳的作用是告诉对方,自己还活着;当然有人说还可以判断链路是否可到达,但是我觉得在JAVA层面这个不是很靠谱。因为当数据刷新到TCP的缓冲区之后,就成功返回了。这也正是即使使用TCP,还需要在业务层封装各种ACK包的原因,即使TCP是可靠链接,它的可靠我理解为是传输时可靠,而非传输前往buffer中写数据的可靠。

在开始之前,首先明确两个概念。

1
2
1. S2S:服务器与服务器之间的通信,网络稳定,基本在同一个IDC内部,当然也有可能跨IDC。
2. C2S:移动设备与服务器之间的通信,网络不稳定。
阅读全文 »
城的灯

Java观察者模式笔记

发表于 2014-09-02 | 分类于 技术

Java观察者模式的实现与对比

观察者模式作为一个耳熟能详的设计概念,早已被绝大多数的程序员所熟悉。虽然Observer和Observable从JDK1.0起就已经存在,但是到现在它们还是那样的难用,至少和Guava的EventBus比较起来。传统的发布订阅模式,主要是为了解决进程内事件的分发,从而去掉了显示的注册方式,从而是组件之间可以更好的解耦。现在的发布订阅随着消息中间件的流行,早已实现了跨进程通信。本文主要是对比JDK和Guava观察者模式的实现区别,如果是玩Android的朋友,还可以看看square/otto(专门为Android平台进行了优化的Guava EventBus库)、greenrobot/EventBus。

阅读全文 »
城的灯

Haproxy之websocket的负载均衡方案

发表于 2014-06-25 | 分类于 技术

最近用websokcet写了一套简单的内部聊天服务,我选择了简单易用的haproxy实现负载均衡。

How does websocket work ?

通常,一个websocket请求的HTTP头如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET ws://ws.im.yangguo.info/ws HTTP/1.1
Host: test.ws.im.yunma1688.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://short.im.yangguo.info
Sec-WebSocket-Version: 13
DNT: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,de-DE;q=0.4,de;q=0.2,zh-TW;q=0.2
Sec-WebSocket-Key: zGYcUVMijj7ihvhLCEegZQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

这里最核心的部分就是Connection: Upgrade头,它让client端知道server端会改变协议,变成如Upgrade: websocketheader中所述的协议。

阅读全文 »
城的灯

Kryo2.22详解

发表于 2014-05-19 | 分类于 技术

在2.22版本修正了许多之前反馈的问题,提高稳定性和性能。 它还引入了许多新的功能,最主要的是,它可以使用Unsafe的方式的直接读取和写入对象的内存。 这中绝对是最快的方式序列化方式,特别是在操作大型原始数组的时候。
Maven仓库中的JAR文件现在包含一个ObjectWeb的“阴影”版本ASM库,以避免与你项目中的ASM库出现兼容问题,从而导致你的应用程序粗线冲突。 这里不再需要一个单独的阴影jar了。

由于本篇文章是之前翻译的,最后迁移到该博客。在迁移过程中可能出现某些地方出错,并且由于水平有限,如果发生上面的情况,请大家发邮件告诉我,谢谢!

概述

Kryo是一种快速,高效的对象图序列化的Java框架。 该项目的目标是速度,效率,以及一个易于使用的API。该项目对那些在任何时间,对象需要被持久化,无论是文件,数据库,或通过网络的项目都是适用的。Kryo还可以自动实现深浅的复制/克隆。 就是直接复制一个对象对象到例外一个对象,而不是对象->字节->对象。
本文档是Kryo的V2版本。如果V1版本感兴趣,见V1Documentation。
如果您打算使用Kryo进行网络通信,该KryoNet项目可能对你有用。


内容

  • Quickstart
  • IO
  • Unsafe-based IO
  • Serializers
  • Registration
  • Default serializers
  • FieldSerializer
  • KryoSerializable
  • Reading and writing
  • References
  • Object creation
  • Copying/cloning
  • Context
  • Compression and encryption
  • Chunked encoding
  • Compatibility
  • Interoperability
  • Stack size
  • Threading
  • Logging
  • Integration with Maven
  • Projects using Kryo
阅读全文 »
城的灯

论技术选型

发表于 2013-11-03 | 分类于 技术

人生就是一道选择题,对于码农来说更是如此。

谁都不想做“起来一个大早,却赶了一个晚集”的人,如果人生的命运你不能掌握,至少在技术这条崎岖的道路上,我们也要努力避免这种悲剧的发生。

风起云涌的新技术,喧闹浮华背后的各大社区,各种榨取码农血汗钱的会议,当然还有各种很久不编码的人生导师,这些会对你每一次技术选型的抉择起到多大作用,我不得而知。我曾经流连于各大技术社区,听各路布道师的成功学,并将很多时髦的技术运用到我的工作中。我一度自我膨胀,认为自己是块材料,至少不是一块废材。陶醉在各种新技术的研究与布道上,直到有一天我离职的时候,我的大老板对我说“你们研究的那些非常好,但是跟业务有点脱钩”。我当时没有在意,因为谁会在意一个不懂技术的Boss的建议呢!但是有一天我在地铁上突然想起那句话,突然思绪就开始飞扬,所以就有了下面的文字。附带一句,本人坐地铁很少玩手机,一般我就做三件事情。

1
2
3
1.思考人生
2.思考技术
3.看美女

正式由于第一件事情,让我对码农这个行业产生了新的认识。如果你不赞成我的观点,没有关系,因为我不企图改变任何人;如果你赞成,那我至少没有白忙活。

阅读全文 »
1234
杨果

杨果

知易行难

37 日志
2 分类
59 标签
RSS
github twitter weibo
© 2022 杨果
由 Hexo 强力驱动
主题 - NexT.Mist