标签:java

TCP 连接的 TIME_WAIT 过多 导致 Tomcat 假死

via: http://www.cnblogs.com/digdeep/

最近系统二次开发之后,发现使用的 Tomcat 7 会经常假死。前端点击页面无任何反应,打开firebug,很多链接一直在等待服务器的反应。查看服务器的状态,CPU占用很少,最多不超过10%,一般只有2%,3%左右,内存占用倒是接近80, 90%。一开始怀疑是tomcat内存配置不够,但是打开 jvisualvm.exe 分析,发现Tomcat 占用的堆内存没有什么问题。因为是假死,所以最后怀疑到 tomcat的 链接数和 数据库的链接数的配置估计太小了。netstat -na 结果页显示很多time_wait.

查看各种状态的网络连接的数量:

1)Linux 使用命令:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

上面的命令可以查出各种状态的网络连接的数量
2)windows使用命令:

netstat -n |find /i “time_wait” /c

netstat -n |find /i “close_wait” /c

netstat -n |find /i “established” /c

windows下没有awk,所以要一个一个状态的统计它们的数量。

结果是:

1)TIME_WAIT: 状态的连接达到了 709

sql server占用的TIME_WAIT最多,还有nginx, tomcat都有一些处于 TIME_WAIT状态。

2)并且最大的端口达到了 65327 ,六万多,几乎接近端口的最大值 65535.

因为是 Windows server 2008,不同Linux下的TCP的调优。

解决方法:将 TcpTimedWaitDelay 调到 30S,让 TIME_WAIT 状态的维持最多30S,默认是4分钟。

如何查看或设置TcpTimedWaitDelay

cmd中运行 regedit 命令,找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键

看看有没有  TcpTimedWaitDelay 项,有的话直接修改,没有的话创建一个并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。 停止并重新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。 建议值:最小值为 0x1E,它将等待时间设置为 30 秒。

修改之后,重启系统,在观察,TIME_WAIT在100左右徘徊。效果还是立竿见影的。几天来一直再也没有出现Tomcat假死的情况。

 

当然也可以同时 增大 MaxUserPort 的数值(2008最大值好像是 65535):

MaxUserPort :确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。默认是65535,可以调到10万.… 继续...

Filed under: 其他Tagged with: ,

java enum的使用以及字符串其字符串之间的转换

via:http://blog.csdn.net/xieyuooo/

文章简单,相信在很多网站都能搜索到Java enum枚举的使用方式;可能有些东西我当时在刚开始用的时候没找到,所以我写了这篇文章,例如:

大多数地方写的枚举都是给一个枚举然后例子就开始switch,可是我想说,我代码里头来源的数据不太可能就是枚举,通常是字符串或数字,比如一个SQL我解析后首先判定SQL类型,通过截取SQL的token,截取出来可能是SELECT、DELETE、UPDATE、INSERT、ALTER等等,但是都是字符串,此时我想用枚举就不行了,我要将字符串转换成枚举怎么转呢,类似的情况还有从数据库取出数据根据一些类型做判定,从页面传入数据,根据不同的类型做不同的操作,但是都是字符串,不是枚举,悲剧的是我很少看到有人写到这个东西;所以我把它写下来,希望有人能用到。

首先为什么要用枚举?我们在什么时候用枚举比较好,用枚举有啥优势?

我认为哈,当你在一些一个范畴类,并可列举,不变化的类型,用以指导程序向不同的地方路由,用枚举是较好的选择;

听起来有点绕,不过有个例子也许可以明白,例如:

我们可以列举下日常工作日所做的事情:

上班、开会、吃饭、睡觉等

我们可以列举医院五官科需要检查人的部位:

眼睛、鼻子、耳朵、嘴巴等

这些都是可以被列举的,且每种事情我们要用不同的方式去做

当然你可以说:

1、可以用动态方法分派,通过配置文件或annotation;

2、可以使用常量来达到类似的效果;

3、直接通过字符串的equals来表达,用if else来表达

如果用配置加方法分派来做,是灵活,便于修改;但是如果在很多不经常修改的参数上,我们用这中方式往往增加配置的负担,并且当你需要看系统逻辑的时候,需要需要一遍看配置一遍看代码;不过,如果参数是可动态变换的信息,用配置是正确的选择;

而常量的使用,通常在switch case的时候都是数字,字符串在java中是不能做switch case的,使用常量的目的比case 1、case 2 …这种增加了可读性;但是字符串数据也麻烦,除非再映射一次,那没那个必要,其实枚举也差不多是帮你映射了一次,只是它将代码封装了而已吧了,既然他弄好了,而且语法上支持,干嘛不用呢!其次,常量虽然增加了可读性,不过他没有范畴和管理类型的概念,即一个枚举的定义会定义个范畴,可以很好的将这个范围所需要的东西列举出来,而常量通常是些自己定义的一些池,放在一些公共类中或随机定义,都是比较零散的,并且枚举在switch的时候就明确定义好了就在锁列举的范围内case,既可以控制好系统,增加可读性,并且可以随时查看这个范畴的枚举信息到底有那些,达到类似看配置文件的作用;不过还是回到那句话,如果参数是可变的,那么就不适合做枚举,枚举是一定是可列举的,或者说当前系统考虑范围是可以被枚举的,例如上面的医院五官科,可能还有很多没有列举到,但是当前医院只处理几个部位,不处理其他的,就是这个道理;什么是可变的呢,例如URL参数来分派到对应方法,不可能大家加一段逻辑就去加一个枚举,加一个case,此时用【配置 动态方法分派】更好,当然配置可以用文件或annotation而已。

还有最土的就是,通过字符串equals,用if else来实现,呵呵,这个并没有什么不好,只是这个写比较零散,其次,字符串匹配的equals每次匹配都需要对比每个字符,如果你的代码中大量循环,性能并不是很好,其余的看看上面的描述就更加清楚了;

其次,枚举提供一种类型管理的组件,让面向对象的体系更加完善,使得一些类型的管理既可配置化,并可以管理,在使用枚举的地方都可以沿着枚举的定义找到那些有处理过,那些没处理过,而上述几种很难做到;例如,数据库的操作类型定义了10种,那么再判定的过程中就可以讲枚举像配置文件一样看待,而又非常简单的来管理。

最后,枚举绝对是单例的,对比的性能和数字性能相当,既可以得到可读性,也可以得到性能。

我们先定义个简单枚举(这里只是个例子,就简单定义3个变量了):

此时解析SQL后,获取出来一个token,我们要获取这个token的枚举怎么获取呢?

这样获取:

Filed under: 程序员Tagged with:

怎么通过java去调用并执行shell脚本以及问题总结

背景

我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发。 java开发的特点就是我们可以很早地进行TDDL, METAQ 等等地对接; 而脚本开发的特点就是在进行批处理的时候非常方便。 前阵子我遇到这么一个需求场景: 对抓取的数据进行打包, 后来又遇到我要通过脚本进行抓取,比如nodejs下基于phantomjs的casperjs爬虫。

解决方法

对于第一个问题:java抓取,并且把结果打包。
那么比较直接的做法就是,java接收各种消息(db,metaq等等),然后借助于jstorm集群进行调度和抓取。 最后把抓取的结果保存到一个文件中,并且通过调用shell打包, 回传。 也许有同学会问, 为什么不直接把java调用odps直接保存文件,答案是,我们的集群不是hz集群,直接上传odps速度很有问题,因此先打包比较合适。(这里不纠结设计了,我们回到正题)

java调用shell的方法

通过ProcessBuilder进行调度

这种方法比较直观,而且参数的设置也比较方便, 比如我在实践中的代码(我隐藏了部分业务代码):

Filed under: 其他Tagged with:

tomcat 异常-java.util.prefs.BackingStoreException

今天Linux部署Tomcat的时候,tail 日志的时候,发现频繁有下面的错误出来:

Couldn’t flush system prefs: java.util.prefs.BackingStoreException: Couldn’t get file lock.

解决办法是: 在执行程序的用户的home目录下:

然后在执行程序之前增加如下参数:

例如tomcat的话,可以建立setenv.sh ,并且添加上述参数 执行即可

参考:

https://confluence.atlassian.com/confkb/could-not-lock-user-prefs-unix-error-code-2-670958391.html

http://stackoverflow.com/questions/23960451/java-system-preferences-under-different-users-in-linux… 继续...

Filed under: @ITTagged with:

Could not generate DH keypair 的问题

项目中出现下述异常

javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair,

具体问题是:在访问https 的时候出现的。原因是

Java 7 以及早期版本是只支持 1024 位的 DH Parma的,解决该异常:

  1. 升级你使用的Java版本到 java 8
  2. 调整https使用的dhparam 指定1024位

修改服务器使用1024位dhparam

Apache.

  1. apache 2.4.7 之后默认使用 2048以上了,如果你要指定1024 ,就在证书后面添加1024位的dh param 参考这里:a. 

继续...

Filed under: 其他Tagged with: ,

Orika 教程以及与Spring的集成

via: http://malsolo.com/  又来挖坑了,找了一圈,只有这篇文字比较详细。得空翻译一下

I love good software, and Orika is a really interesting project. In this post I’m going to talk about this Java bean mapping framework that I’ve used recently and I highly recommend.

Orika (formerly hosted at google code) claims to be a simpler, lighter and faster Java bean mapping. And it really is.

It allows you to convert objects by copying its attributes from one to another.… 继续...

Filed under: 程序员Tagged with: ,

Java 多线程

随着多核芯片逐渐成为主流,大多数软件开发人员不可避免地需要了解并行编程的知识。而同时,主流程序语言正在将越来越多的并行特性合并到标准库或者语言本身之中。我们可以看到,JDK 在这方面同样走在潮流的前方。从JDK 5到JDK 7,越来越多的线程相关的新API加入到了标准库中,为不同场景下对线程实现与调度提供了完善的支持。我们可以充分利用这些类库,来提高开发效率,改善程序性能。

Java中使用线程

Java的多线程基于以下两个重要的机制:

  1. 父线程结束,如果子线程正在运行,子线程不会跟着结束。
  2. 每个线程拥有一个线程栈,会维护引用,用于GC。

Java提供了以下两种常用的方式来使用多线程:

  1. 继承Thread
  2. 实现Runnable接口

继承Thread

Filed under: 程序员Tagged with:

解决IDEA使用jetty跑项目js、css文件被占用无法修改的问题

用IDEA开发web项目使用maven的jetty插件跑的时候经常遇到项目启动后,无法编辑js文件和css文件。
最初以为是Idea的问题,但是这么严重的一个问题怎么就没有人注意呢?
后来又上网查了好多资料,原来才发现不是IDEA的问题,是jetty本身的问题:原因是如果NIO被支持的话,Jetty会使用内存映射文件来缓存静态文件,其中包括.js文件。在Windows下面,使用内存映射文件会导致文件被锁定。
解决方案是不使用内存映射文件来做缓存。

到maven本地仓库的org/eclipse/jetty/jetty-webapp/下,找到对应版本的jetty插件修改webdefault.xml
将:

 

改为:

 

即可搞定!
也可以将此文件拷贝到项目中,在jetty插件配置中引入:

Filed under: 奇技淫巧Tagged with:

OWNER:Java配置文件解决方案

OWNER是一个Java库,目标是最大限度的减少应用程序中处理Java properties的代码。

自动草稿

主要功能

OWNER的设计遵循以下座右铭: 功能丰富的API,新功能添加的同时不忘保持极简的基本用法。

  • 加载策略:OWNER通过匹配接口类名和properties文件名自动解析并映射;也可以通过注解定制properties文件名。
  • 导入properties:另外一种加载properties文件到映射接口的方法。
  • 参数化properties:另外一个实用功能,给接口方法提供参数,通过参数配置。
  • 类型转换:支持从String类型到基本类型和枚举类型的转换。
  • 变量扩展:引用properties中的其他属性。
  • 热加载:支持热加载。
  • 可访问和可变:可以继承Config的子接口Accessible或者Mutable实现属性的可访问和可变。
  • 调试:支持调试功能。
  • 禁用功能:可禁用引起问题的功能。
  • 配置ConfigFactory:ConfigFactory也是可配置的。
  • XML支持:支持XML配置。
  • 事件支持:OWNER实现了功能丰富的事件系统,使你知道热加载的发生和属性变化。
  • 单例模式:配置信息在一个应用中是单例的。

官方文档

官方网站:http://owner.aeonbits.org/
开源地址:https://github.com/lviggiano/owner继续...

Filed under: 程序员Tagged with: