怎样估算一个map占用了多少内存?

javaweb_coder 2014-07-06 11:38:21
加精
我的业务场景:
在线聊天室,因为需要保持长连接,所以一个聊天室ChatRoom里面包含了最多200个Socket。
而在线聊天室最多情况10w个,然后这10w个ChatRoom都放到map中。

即:

Map<ChatRoom> chatrooms = new HashMap<ChatRoom>();
chatrooms.put(chatroomId,chatroom);// put 10w个,每个chatroom都存有200个socket,都存在内存中。
...全文
11427 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
lihai .
l4kangaxx 2014-07-10
  • 打赏
  • 举报
回复
看不出有何难度,因为你压根没说打算用多少硬件。 如果你说打算用一台i7 4核+20M带宽,那我会觉得你疯了。 同学你这又不是算法问题,你这个说白了是网络硬件架构问题。交给硬件架构部的同事吧。
land是 2014-07-09
  • 打赏
  • 举报
回复
lhw7791086 2014-07-09
  • 打赏
  • 举报
回复
_周星星 2014-07-09
  • 打赏
  • 举报
回复
showjim 2014-07-07
  • 打赏
  • 举报
回复
内存占用多少与每个Socket占用的缓冲区大小相关,如果是单纯的Socket可以自己指定缓冲区大小,你说的websocket组件不知道有没有这功能。知道了缓冲区大小,你就可以自己计算内存占用了,比如2000W*8KB=160GB。 为了减少Socket数量,你可以让每个客户端公用一个Socket。 有足够的内存保持长连接,不代表你的一台服务器能处理多少连接。比如你的服务器只能处理5W次/s交互,而你实际需求可能有10W次/s,那么肯定是不行的。
业余草 2014-07-07
  • 打赏
  • 举报
回复
引用 2 楼 vnvlyp 的回复:
10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
说的很详细,如果没有集群,千万的级别量,你想都别想。现在随便找一个网站,基本上都有集群
rumlee 2014-07-07
  • 打赏
  • 举报
回复
如果你用传统IO,一台服务区可能勉强能够支持一两千个socket差不多,用NIO,程序优化的好的话,可能能够支持几千到万把个。 当然这只是粗略估算,具体的你要实测一下。 具体消耗多少内存,直接用工具实测是比较准确的。
teemai 2014-07-07
  • 打赏
  • 举报
回复
这有点牛叉。 计算下一个ChatRoom的所占字节数,比如各个字段的大小,一个chatroom出来了,总的就出来了。
javaweb_coder 2014-07-07
  • 打赏
  • 举报
回复
完美情况下,可能有10w个,真实情况肯定不会有这么多。我只是想先计算下。我用的websocket。
javaweb_coder 2014-07-07
  • 打赏
  • 举报
回复
引用 2 楼 vnvlyp 的回复:
10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
感谢分享,能几点计算下吗?我要计算下内存,然后根据结果来开放多少个聊天室。
致知Fighting 2014-07-07
  • 打赏
  • 举报
回复
引用 2 楼 vnvlyp 的回复:
10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
人的socket是监听的socket吧,又不是客户端socket,怎么会有2000w个怎么多?
  • 打赏
  • 举报
回复
楼上详解,膜拜下。
showjim 2014-07-07
  • 打赏
  • 举报
回复
引用 11 楼 javaweb_coder 的回复:
感谢建议,我会去了解下。 但是客户端怎么公用一个socket呢?每一个用户加入聊谈室都要新建一个socket与服务器连接。能否详细说说?
b/s的webSocket没用过,c/s的话就比较简单。
javaweb_coder 2014-07-07
  • 打赏
  • 举报
回复
引用 8 楼 rumlee 的回复:
如果你用传统IO,一台服务区可能勉强能够支持一两千个socket差不多,用NIO,程序优化的好的话,可能能够支持几千到万把个。 当然这只是粗略估算,具体的你要实测一下。 具体消耗多少内存,直接用工具实测是比较准确的。
恩,一个服务器端程序测了是4000个左右。多开几个服务可以连接更多socket。我怕瓶颈是内存扛不住
javaweb_coder 2014-07-07
  • 打赏
  • 举报
回复
引用 9 楼 xmt1139057136 的回复:
[quote=引用 2 楼 vnvlyp 的回复:] 10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
说的很详细,如果没有集群,千万的级别量,你想都别想。现在随便找一个网站,基本上都有集群[/quote] 前期集群,我可以多启动几个服务段程序来接受socket连接
javaweb_coder 2014-07-07
  • 打赏
  • 举报
回复
引用 10 楼 sbwwkmyd 的回复:
内存占用多少与每个Socket占用的缓冲区大小相关,如果是单纯的Socket可以自己指定缓冲区大小,你说的websocket组件不知道有没有这功能。知道了缓冲区大小,你就可以自己计算内存占用了,比如2000W*8KB=160GB。 为了减少Socket数量,你可以让每个客户端公用一个Socket。 有足够的内存保持长连接,不代表你的一台服务器能处理多少连接。比如你的服务器只能处理5W次/s交互,而你实际需求可能有10W次/s,那么肯定是不行的。
感谢建议,我会去了解下。 但是客户端怎么公用一个socket呢?每一个用户加入聊谈室都要新建一个socket与服务器连接。能否详细说说?
vnvlyp 2014-07-07
  • 打赏
  • 举报
回复
10万*200 = 2000万个Socket 别说64GB,64TB内存估计都不够用 再说一台机器可用的端口数有限,一般不超过65536个,你这根本创建不了那么多Socket。。 另外2000万个Socket这种规模,你想用一台服务器搞定,开什么玩笑?就算内存够用,CPU,磁盘IO,网络IO承受得了2000万个Socket?你当那是超算?超算都不带这样玩的。。 这种规模都是大型集群服务,而且为了速度,一般还设有很多分布式节点服务器为不同地区的用户导流,通常都有几百甚至上千台各类服务器协同工作 最后提醒你一下你确定这是实在的需求,而不是你的美好展望? 10万个房间,每个房间能容纳200人,也就是理论同时在线可达千万人,这种规模的聊天室,全世界都数得出来有哪些吧
javaweb_coder 2014-07-06
  • 打赏
  • 举报
回复
服务器有64G内存,够不够? 可以怎么设计这个聊天室? 我的理解是:因为socket肯定是需要存到内存中,所以同时在线的10w个也都需要存到内存中。结果就是我认为这么多数据都需要存内存中。

62,614

社区成员

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

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