MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。   
CyclicBarrier  : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。

CyclicBarrier 在释放等待线程后可以重用,所以称它为循环的 barrier。它 还支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。



public class Test {
    public static void main(String[] args) {
        new Test().test1();
    }
    
    public void test1() {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有玩家进入第二关!");
            }
        });

        for (int i = 0; i < 4; i++) {
            new Thread(new Player(i, cyclicBarrier)).start();
        }
    }

    class Player implements Runnable {
        private CyclicBarrier cyclicBarrier;
        private int id;

        public Player(int id, CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
            this.id = id;
        }

        @Override
        public void run() {
            try {
                System.out.println("玩家" + id + "正在玩第一关...");
                cyclicBarrier.await();
                System.out.println("玩家" + id + "进入第二关...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

posted @ 2015-03-02 06:28 leekiang 阅读(302) | 评论 (0)编辑 收藏

Runtime run = Runtime.getRuntime();
String str[] = { "/bin/sh", "-c", "echo '1' >> test.log" };
try {
    run.exec(str);
} catch (IOException e) {
}


使用Jsch执行Shell脚本 [http://blog.csdn.net/basecn/article/details/6080741]
纯Java通过SSH执行Linux命令的方法及代码 [http://ilexes.blog.51cto.com/705330/531352]
Java调用 Shell的ftp命令 [http://blog.sina.com.cn/s/blog_59ca2c2a0100e9vn.html]

posted @ 2015-03-01 00:29 leekiang 阅读(203) | 评论 (0)编辑 收藏


1. java.lang.OutOfMemoryError: GC overhead limit exceeded原因
   <http://blog.csdn.net/taijianyu/article/details/6606792>
   <http://www.sunnybtoc.com/page/M0/S746/746195.html>
   
2. 用jhat分析·jmap -dump:format=b,file=mem.dat PID·命令导出来的文件时报错
   java.io.IOException: Unrecognized magic number
   <https://forums.oracle.com/forums/thread.jspa?threadID=1542284> 没找到原因
   
3. 命令
   1. jmap
 jmap -dump:live,format=b,file=heap.dmp PID 把本机的java内存映像导出到heap.dmp中
 jmap pid #打印内存使用的摘要信息
      jmap –heap pid #java heap信息
      jmap -histo:live pid #统计对象count ,live表示在使用
      jmap -histo pid >mem.txt #打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件
      jmap -dump:format=b,file=mem.dat PID #将内存使用的详细情况输出到mem.dat 文件
   2. jhat 用来分析jmap导出的文件
      用jhat命令可以参看 jhat -port 7000 mem.dat
      然后使用:http://127.0.0.1:7000/ 查看类相关信息
   3. jstat
      jstat -gcutil  PID
      例子:

    S0      S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
    11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579

    S0  — Heap上的 Survivor space 0 区已使用空间的百分比
    S1  — Heap上的 Survivor space 1 区已使用空间的百分比
    E   — Heap上的 Eden space 区已使用空间的百分比
    O   — Heap上的 Old space 区已使用空间的百分比
    P   — Perm space 区已使用空间的百分比
    YGC — 从应用程序启动到采样时发生 Young GC 的次数
    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC — 从应用程序启动到采样时发生 Full GC 的次数
    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)


###参考
1. [JMAP、jstat命令详解](http://bbs.chinaunix.net/thread-3644198-1-1.html)
2. [J2SE6中使用jhat来分析内存堆](http://hi.baidu.com/tister/item/9444a3125796cf433a176eb9)


###jvm的内存回收过程是这样的
对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,
把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。
当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,
同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space
中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,
此时这些对象将被复制到Permanent Generation。

posted @ 2015-02-17 06:51 leekiang 阅读(478) | 评论 (0)编辑 收藏

JavaMelody 能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、Guice)的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。

jwebap 监控org.apache.commons.dbcp.BasicDataSource时不知效果如何
JAMon

hyperic hq
probe   http://www.lambdaprobe.org/downloads/1.7/probe.1.7b.zip

项目自动化之道—如何建构、部署、监控JAVA应用.pdf


http://chain.blog.163.com/blog/static/140848523201171623521235/  java使用java.lang.management监视和管理Java虚拟机

String processName = java.lang.management.ManagementFactory
.getRuntimeMXBean().getName();
System.out.println(processName.split("@")[0]);//进程ID

http://chain.blog.163.com/blog/static/1408485232011716111013282/ java通过调用命令获取linux CPU、内存、磁盘信息

posted @ 2015-02-17 06:35 leekiang 阅读(376) | 评论 (0)编辑 收藏

如果报Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll的错误,可把jdk下的jre\bin\server下的server文件夹复制到C:\Program Files\Java\jre6\bin目录即可解决。 根本原因可看[JVM的版本问题](http://www.cnblogs.com/newskysoft/archive/2010/04/23/1718720.html)

posted @ 2013-02-17 18:19 leekiang 阅读(2114) | 评论 (0)编辑 收藏

在notepad++里查看二进制有三种办法:“插件”菜单里有个Converter,TextFX插件也有Convert功能,甚至还有一个在新版本好像已经被废弃的Hex Editor插件,但这些都不好用。
[HxD](
http://mh-nexus.de/en/hxd/)是一个免费的二进制编辑软件,但中文支持不好。
MadEdit是一款跨平台的编辑器,用其进行二进制编辑的体验相当好,不管是GBK还是UTF-8的中文都能正常显示,选中某个中文其对应的字节会高亮显示。不知道在mac下效果如何。


posted @ 2013-01-05 17:18 leekiang 阅读(1448) | 评论 (0)编辑 收藏

最近Web服务访问量过大,由于服务器配置比较差,数量也较少,导致服务响应过慢。为了优化服务和提高响应,下面总结出几条查询Resin问题的方法。

1、查看服务器网络状态TIME_WAIT的数量。

#netstat -antp|grep -i time_wait|wc -l查看TIME_WAIT数量,如果数量过多,并且Resin前端还有Nginx或者Apache,那么请把socket-timeout、keepalive-max和把keepalive-timeout调小

      <socket-timeout>30s</socket-timeout>
      <keepalive-max>512</keepalive-max>
      <keepalive-timeout>60s</keepalive-timeout>

2、查看JVM中对象占用内存情况

jmap 能查看jvm内存中,对象占用内存的情况,还提供非常方便的命令将jvm的内存信息导出的文件。

#jmap -dump:format=b,file=heap.bin <pid> 

命令jhat 能够解析 java内存堆的文件,生成相关信息,并启动webServer提供查询。 也就说,我们可以通过浏览器来看这些内存信息。jhat还提供了一个类sql的查询语言---OQL来给我们使用。

#jhat -J-Xmx512m heap.bin    

就可以将我们刚刚使用jmap导出的内存信息交给jhat解析了。默认的情况下,它会监听7000端口。我在本机的地址就是,http://localhost:7000/。
访问http://localhost:7000/histo/,大致可以看到一下的画面,这里列出对象,对象实例数量、总占用内存大小。点击进去之后可以看到“谁引用了这个对象,这个对象又引用了哪个”这些信息。不过因为展示的信息非常多,并没有想象中那样清晰可见。

3、dump获取java stack和native stack信息

消息队列会突然堵塞,查看消费者日志,发现处理延时明显延长,而此时网络无丢包。最后多方排查,是java消费者运行出现死锁。
这种问题可以通过jstack来dump获取java stack和native stack信息查明问题。

#jstatck <pid>


posted @ 2012-07-13 15:48 leekiang 阅读(847) | 评论 (0)编辑 收藏

slideViewer:http://www.gcmingati.net/wordpress/wp-content/lab/jquery/imagestrip/imageslide-plugin.html
slideViewerPro:Prohttp://www.gcmingati.net/wordpress/wp-content/lab/jquery/svwt/index.html

slideViewerPro使用配置说明 http://www.oschina.net/p/slideviewerpro


Can I make the Jquery slideViewer autoplay?
<scripttype="text/javascript">
var theLinks;
var nCount =0;
var theTimerID;

function init(){
    $
("div#mygalone").slideView();
    theLinks
= jQuery('#stripTransmitter0 a');

       
//for kill interval purposes
    theTimerID
= setInterval("autoSlide()",5000);
}
function autoSlide(){
    jQuery
.each(theLinks,function(i){
       
if(jQuery(this).hasClass('current')){
            jQuery
(theLinks[((i+1< theLinks.length)?(i+1):0)]).trigger("click");
           
returnfalse;
       
}
   
});
}

$
(window).bind("load", init );
</script>

The way I see it you basically have 3 options here:

(1) - Use slideViewPro, but disable thumbnails using the thumbsVis:false option as shown below

$("div#noui").slideViewerPro({
    galBorderWidth
:0,
    autoslide
:true,  
    thumbsVis
:false,
    shuffle
:true
 
});

(2) - Switch to using the jQuery cycle plug-in instead

(3) - Edit the source code of original slideViewer and add your own autoslide implementation by using timers and firing the click event on the navigation.



posted @ 2012-03-11 03:00 leekiang 阅读(513) | 评论 (0)编辑 收藏

转自 一个BUG的快速解决方法.希望能给大家的一些启示
朋友打来电话,他们公司新装了TOMCAT5,然后在编译JSP时,被INCLUDE的JSP都出现了问题.就是编译后被INCLUDE的地方多了两个"??"而其它正常,而如果手工把被INCLUDE的内容COPY上去测没有问题.
他们的工程师都不知道是什么问题,因为周一要发布出去,所以非常着急.

我不知道大家听到这种情况会如何,我知道大多数人比我聪明,你肯定想到了,所以你没有必要再看了.我下面的内容只是对没有想到的人而言.

其实他电话还没打完 ,我就知道问题99%是他的jsp在编辑的时候是存为UTF-8而不是ANSI格式,否则没有道理出现这种问题,事实正是如此,我让他用UE打开看看果然前面多了几个UTF字符.

重要的是TOMCAT这种容器竟然有这样的BUG,不能正确读取UTF-8格式的文件,你总不能强求用户编辑JSP文件时一定要存为什么格式吧?
费话少说,下载tomcat5的src,进入jakarta-tomcat-jasper\jasper2\src\share\org\apache\jasper\compiler,找到JspUtil.java,找到
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {

InputStream in = null;

if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
}
in = jarFile.getInputStream(jarEntry);
} else {
in = ctxt.getResourceAsStream(fname);
}

if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
}
return in;
}

在return in前加上判断,改成:
public static InputStream getInputStream(String fname, JarFile jarFile,
JspCompilationContext ctxt,
ErrorDispatcher err)
throws JasperException, IOException {

InputStream in = null;

if (jarFile != null) {
String jarEntryName = fname.substring(1, fname.length());
ZipEntry jarEntry = jarFile.getEntry(jarEntryName);
if (jarEntry == null) {
err.jspError("jsp.error.file.not.found", fname);
}
in = jarFile.getInputStream(jarEntry);
} else {
in = ctxt.getResourceAsStream(fname);
}

if (in == null) {
err.jspError("jsp.error.file.not.found", fname);
}
PushbackInputStream testin = new PushbackInputStream(in);
int ch = testin.read();
if (ch != 0xef) {
testin.unread(ch);
}
else if ((ch = testin.read()) != 0xbb) {
testin.unread(ch);
testin.unread(0xef);
}
else if ((ch = testin.read()) != 0xbf) {
throw new IOException("错误的UTF-8格式文件");
}
else{
//fStream.setEncoding("UTF-8");
testin.read();
}
return testin;
}

编译,重新打包,替换原来的包,运行TOMCAT,OK!

整个问题解决除了远程登录他的服务器传送文件的时间,总共只有4-5分钟.其实只要问题定位准确,就不难解决了.我一再强调的是经熟悉底层,你如果知道内 存中每个byte从哪儿来要到哪儿去,就可以非常容易地解决问题.在此之前我连TOMCAT5下载都没有下过,更别说试用了.但只要你对JDK有深入的了 解,就可以准确地定位问题的所在.

希望本文能给不是高手的朋友一点帮助和启发,对于高手的朋友你可以弃之一笑.


UTF-8文件的Unicode签名BOM(Byte Order Mark)问题
utf-8编码include页面空格
Django下碰到EF BB BF问题
php utf-8编码include页面空格

posted @ 2012-03-03 23:26 leekiang 阅读(459) | 评论 (0)编辑 收藏

1,安装
yum install mysql-server,会同时安装mysql包。默认安装5.0版本。
卸载:yum remove mysql-server

2,配置
默认配置文件在/etc/my.cnf
默认datadir=/var/lib/mysql
默认socket=/var/lib/mysql/mysql.sock
mysqladmin、mysqldump等命令在/usr/bin
mysqld在/etc/init.d/mysqld

3,命令
启动 service mysqld start
停止
service mysqld stop
开机自启是用"chkconfig --levels 235 mysqld on"还是"chkconfig mysqld on"

如果启动报错,很可能是磁盘满了。
如果开启了selinux,可能会导致mysql启动不成功。另外要记得设置iptables的3306端口



Centos 安装Mysql
Solve: Can’t connect to local MySQL server through socket /tmp/mysql.sock
MYSQL: ERROR 2002 (HY000):Can't connect to local MySQL server

posted @ 2011-12-12 01:22 leekiang 阅读(376) | 评论 (0)编辑 收藏

仅列出标题
共54页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last