月度归档:2012年09月

几种JVM垃圾回收类型及特点

1. 引用计数方式
堆中每个对象都有一个引用计数器,创建对象时,该对象的引用计数置1,此后,当有其他变量引用该对象时,引用计数都会加1。当一个变量被设置成新值或者引用超时后,引用计数减1。当引用计数器值为0时,该对象会被回收。这种gc方式可避免STW问题,但是它无法检测出循环引用的对象,因此会造成内存泄露,而且维护计算器也会造成一定开销。

2. 标记-收集-压缩(mark-sweep-compact)方式
垃圾收集器从root开始,追踪对象的引用图,并标记为活的对象,此为mark过程。遍历整个堆空间,将未被标记为活的对象清理掉,此为sweep过程。对sweep过后的堆空间进行压缩,去除内存碎片,此为compact方式。经过一次mark-sweep-compact处理之后,当前所有活的对象都被转移到一块连续的堆空间中。这种方式的gc不会出现内存泄露问题,但是compact的过程会导致程序暂停运行,而且sweep是对整个堆空间进行扫描,存在性能问题。

3. 拷贝回收
这种方式的垃圾回收是在内存中开辟堆空间两倍大小的空间,每次只使用一半空间。每一次gc都会把这一半中活的对象拷贝到另一半中。这种gc方式效率高,不必遍历整个堆空间,但是gc期间会造成程序停止运行,而且会造成一些生命周期较长的对象反复来回拷贝,并且,它需要的堆大小是其他方式的两倍。

4. 分代收集
分代收集的理论基础是:大部分对象的生命周期很短,但是总有一些对象的生命周期很长。这种gc方式会将堆空间按代分成多个区域,不同区域可采用不同的gc算法。年轻代的堆空间存放年轻对象,这个区域gc较频繁,当一个对象经过多次gc仍旧存活时,就被拷贝到老年代堆空间,这个区域gc不会太频繁。分代收集很好的在性能和程序可用性之间取了平衡,在各jvm的实现中较常见。

--EOF--

『我在伊朗长大』

“我们国家对战争和烈士已经司空见惯了,所以,就像我父亲讲的:‘当大浪袭来的时候,低下头让它过去!’,这是很波斯化的语言,是一种听天由命的哲学。”

“我懂得了一个最基本的道理:只有当灾难还能承受时,我们才会自怨自艾……一旦超越了这个限度,忍受无法忍受的痛苦的唯一办法就是一笑置之。”

 

 

 

--EOF--

curl发送http请求

curl可以通过命令行或脚本的方式调用http接口,特别在调用rest接口时非常有用。

最简单的GET一个页面可以直接输入curl url,例如:curl www.fengchj.com。

通过几个参数更方便看清http的请求-响应过程。

-X METHOD: -X参数用来指定http method,默认为GET,可以无需指定。例如 -X PUT, -X POST -X DELETE等等。
-H HEADER: -H参数用来指定http header,例如设置Content-type可以通过-H "Content-type: Application/json"实现,设置自定义头X-header可以通过-H "X-header: my-custom-header"实现。
-d CONTENT: 如果请求的方法是POST或者PUT,一般情况下该请求都会携带请求体内容, 可用-d参数用来指定http body。
-i: 参数-i用来显示http响应的header。

举个栗子:

1
2
curl -i -X POST -H “Content-type: application/json" -H "Accept: application/json" 
-d "{\"name\": \"kaka\", \"pass\":\"123\"}" www.fengchj.com/login

上面这个curl命令表示向www.fengchj.com/login这个地址POST一个http请求,请求体内容为{"name": "kaka", "pass":"123"},请求头有Content-type和Accept,通知服务器端以json方式解析请求体,并表示接受json的响应体格式。-i会显示响应头。

============2013-03-26================

补充参数:
--cookie: 附带cookie。如:--cookie "cookieName1=cookieValue1;cookieName2=Value2"
-v: verbose,详细HTTP请求。包含Response Code, Request Header和Response Header等。

--EOF--