JVM最大线程数修改

fainfy 2012-06-08 03:06:18

import java.util.ArrayList;
import java.util.List;

/**
*
*/

/**
* @author Louie
*
*/
public class TestMaxThread {

public static void main(String[] args) {

List<Thread> ths = new ArrayList<Thread>();

int maxThread = 500000;
if (args.length > 0) {
maxThread = Integer.valueOf(args[0]);
}

for (int i = 0; i < maxThread; i++) {
Thread t = new TestThread();
String name = "Thread-" + i;
t.setName(name);
t.start();
ths.add(t);
System.out.println(name);
}

}

private static class TestThread extends Thread {
/*
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {

while (true) {
try {
Thread.sleep(1000 * 60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}


目前在做一个TCP即时通讯工具。上面这段简单的测试就是测试一下服务器(服务器为:SUSE 10 x64)支持最大的线程数。
目前要求是一块单板要10万用户同时在线,平均1个用户至少有2个线程会持续运行,平均一块网卡要保持5万的连接数。

--------------------------------------------------------------------------------------------------------------
上面测试的数据如下:
启动参数:java -server -Xss128k
线程数:21592

启动参数:java -server -Xss64k
线程数:32200

启动参数:java -server -Xmx3g -Xss64k
线程数:12006

java -server -Xmx2g -Xss64k
线程数:20112

java -server -Xmx1g -Xss64k
线程数:32186

启动参数:java -server -Xmx512m -Xss64k
线程数:32202

启动参数:java -server -Xms3g -Xss64k
线程数:12008

--------------------------------------------------------------------------------------------------------------
目前测试SUSE10服务器,每个线程平均64k最大线程数大概在3.2万左右。但是实际情况每个线程最少设置128k,上面的测试大概在2.1万的线程数。

按10万个用户同时在线,平均每个用户2个线程。那么这块单板最少要支持20万线程同时运行。
请问JVM怎么调整线程最大数,SUSE Linux怎么调整线程最大数,有经验的朋友请分享下呀。

如果大家有开发过此类型的项目,请分享一下你的解决方案呀。
感谢,感谢,万分感谢!!!
...全文
937 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqfddqr 2012-06-09
  • 打赏
  • 举报
回复
同时在线的可以用心跳检测吧 非得同时都开着线程?
xlhb 2012-06-09
  • 打赏
  • 举报
回复
从你的回复来看,你可能不太理解NIO机制,NIO是支持长连接的;主要原理是基于事件机制,采用非阻塞技术;所以不会因为read或write导致线程因为需要等待数据而阻塞。

你可以用一个线程负责10个用户的数据接收,负责另外10个用户的数据发送。

当然也可以用一个线程同时负责5个用户的数据接收和发送。


另外也请你放心的是,NIO并非Java原创,它早就广泛应用于各种操作系统。
大并发系统基本上没有不采用非阻塞IO机制的。
RDroid 2012-06-09
  • 打赏
  • 举报
回复
用java NIO来做吧,推荐mina
用线程池来处理业务,有人曾经在单台机器上实现了512k个Socket长链接

对于业务模型来说,如果使用Socket,每个用户也就是占用1个链接。按512k个链接算的话,可以支持50万人同时连到同一台服务器上。对于每个用户而言,大部分时间cpu都是空闲的,根本不需要为每个用户开线程,更不可能给每个用户开2个线程。线程也不是越多越好,一般来讲,线程数和CPU数成正比, 最好不超过10×CPU个数。
MiceRice 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
这并不是NIO与IO的问题。我们是做的一个与第三方连接的IM(GTalk,MSN)。业务需要1个用户至少使用2个线程。一个线程等待接收第三方IM的数据,另外一个线程发送数据。
[/Quote]

从你的回复来看,你可能不太理解NIO机制,NIO是支持长连接的;主要原理是基于事件机制,采用非阻塞技术;所以不会因为read或write导致线程因为需要等待数据而阻塞。

你可以用一个线程负责10个用户的数据接收,负责另外10个用户的数据发送。

当然也可以用一个线程同时负责5个用户的数据接收和发送。


另外也请你放心的是,NIO并非Java原创,它早就广泛应用于各种操作系统。
大并发系统基本上没有不采用非阻塞IO机制的。
龙四 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:

一个Java程序线程数如果不够,就启动两个好了。为啥要纠结单个应用的线程数量这个问题?

即便从系统总体可用性来说,你也应该使用集群机制来消除单点故障。

另外,这么大规模的TCP长连接,应该采用NIO技术,1条线程负责看管10~100个连接好了。

并没有说要纠结一个应用啊。
一台单板要支持10万用户,一个应用支持5万,一台单板部署2个应用。
这……
[/Quote]


开那么多线程,系统开销很大
brightyq 2012-06-08
  • 打赏
  • 举报
回复
这么多线程同时吗?
实际应用中,虽然支持10万有户同时在线,但不是同时20万个线程在运行吧?
如果这样的需求,那最好要说服客户升级硬件,或找服务器的运营商,让他们协助调试。服务器的厂商优化、调查试一下,性能也许会上升很明显,当然这也是要钱的,需要说服客户。
fainfy 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

一个Java程序线程数如果不够,就启动两个好了。为啥要纠结单个应用的线程数量这个问题?

即便从系统总体可用性来说,你也应该使用集群机制来消除单点故障。

另外,这么大规模的TCP长连接,应该采用NIO技术,1条线程负责看管10~100个连接好了。
[/Quote]
并没有说要纠结一个应用啊。
一台单板要支持10万用户,一个应用支持5万,一台单板部署2个应用。
这是需求没有办法改变,客户提供单板机,如果不把性能发挥,这太浪费资源,哪个客户愿意干啊。

这并不是NIO与IO的问题。我们是做的一个与第三方连接的IM(GTalk,MSN)。业务需要1个用户至少使用2个线程。一个线程等待接收第三方IM的数据,另外一个线程发送数据。
古布 2012-06-08
  • 打赏
  • 举报
回复
目前是3W左右,和10W比起来,差距挺远。

LZ研究一下Apache MINA 2 一个高并发网络框架.支持 TCP/IP、UDP/IP等传输方式。
http://mina.apache.org/performance-test-reports.html
yjflinchong 2012-06-08
  • 打赏
  • 举报
回复
我一般就是100个线程左右

用连接吧。 哪有用几万个线程的
MiceRice 2012-06-08
  • 打赏
  • 举报
回复
一个Java程序线程数如果不够,就启动两个好了。为啥要纠结单个应用的线程数量这个问题?

即便从系统总体可用性来说,你也应该使用集群机制来消除单点故障。

另外,这么大规模的TCP长连接,应该采用NIO技术,1条线程负责看管10~100个连接好了。

sffx123 2012-06-08
  • 打赏
  • 举报
回复
没研究不过百度到一个
http://gflei.iteye.com/blog/709355
mark一记坐等学习了。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧