能否通过集群部署来突破32位机上的JVM内存限制,我的理解请大家指正。
我的意思是,单个JVM的内存数不能大于1.5G,那么对于很多服务器,例如有32G内存的小型机,部署一个应用内存上的浪费岂不是太大了,根本无法完全发挥它的优势嘛!
而且,在我们的应用中,有的时候是可能突破1.5G限制的,尽管很少会出现,即使出现了也可以通过代码去解决,但是我总觉得眼睁睁得看着32G的内存却用不上,感觉可惜了。
后来我想,集群部署是不是可以解决这个问题,通过把应用部署在4-5个虚拟服务器上,每个受管服务器都有一个1.5G的JVM,这样4个话不久有6G的JVM可用空间了吗?
不知道我的理解对不对?有没有其他的好法子呢?欢迎大家参与讨论并指正!
如果用集群部署,假设我的系统使用的Spring+Hibernate技术,那么当我把应用部署到集群上后,除Session是状态复制外,其他的操作会不会也被复制。
比如,我在应用中写一个定时写数据库的定时器,如果部署到集群上,假设有4个集群服务器,我的定时器是12:00启动,那么到12:00时,会不会所有的受管服务器都启动定时器,实际部署中,我发现有这个问题,就是写了4份数据到数据库中了。
像这种问题,又如何处理呢?难道不用集群? 1 楼 joyfun 2009-09-29 单个内存不超过1.5G估计是上个世纪的事情了
现在的64位jdk可以支持到2T
如果应用到集群上 定时器之类的东西肯定要修改一下代码 用任务调度来实现 2 楼 humaeks 2009-09-29 楼上请注意楼主的32位机
数据库的定时器可以利用数据库锁定解决。把那条计划任务从待执行变成执行中,可以保证只有一个jvm拿到。 3 楼 mwmw 2009-09-29 确切的说对这个不是很了解,但是Windows已经提供了相应的能够扩展内存的解决方案(AWE),Linux下肯定也有这样的解决方案。
还有一种是JVM级别的cluster (Terra-cotta),通过这种集群也能很好的利用内存。
但是一个很重要的问题是GC,如果你把内存开的很大,到时候Full GC的时候pause的时间会很长,反而会很影响性能。也是要考虑的。 4 楼 treblesoftware 2009-09-30 ZL,难道非得装32位的系统?装个64位的系统,64位的JVM不就行了? 5 楼 whaosoft 2009-09-30 mwmw 写道确切的说对这个不是很了解,但是Windows已经提供了相应的能够扩展内存的解决方案(AWE),Linux下肯定也有这样的解决方案。
还有一种是JVM级别的cluster (Terra-cotta),通过这种集群也能很好的利用内存。
但是一个很重要的问题是GC,如果你把内存开的很大,到时候Full GC的时候pause的时间会很长,反而会很影响性能。也是要考虑的。
是呀 java的gc挺讨厌的 6 楼 pipilu 2009-09-30 不知道你这个集群的作用是什么,是为了负载均衡么?那什么会出现向数据库写入重复数据的情况呢?
如果觉得服务器还可以更多的利用,那就在上面多跑几个应用呗,多几个jvm进程。 7 楼 lnaigg 2009-09-30 企业级应用来说,集群是一个重点话题,解决方案多如牛毛。
网络、硬件、内存、中间件、应用各个级别都有集群方案,而各种方案都有好处也有技术限制的。
做集群更多要考虑是如何提高应用性能的扩展能力,所以LZ就不要只盯着JVM这点内存限制了,就算用了64位jvm也有可能要做集群。
应用设计的初期就应该考虑到应用的规模,而对应做出集群的考虑。如果你的应用就定位在单服务器上跑的,那考虑那么多干啥。 8 楼 lz_cleaner 2009-09-30 上64位,直接搞定,何必去找那个麻烦。 9 楼 sohuexe 2009-09-30 the_definitive_guide_to_terracotta_cluster_the_jvm_for_spring_hibernate_and_pojo_scalability 这本书或许不错,要的话留言! 10 楼 someone 2009-09-30 LZ的想法是可行的,曾经使用过类似部署方法。
服务器操作系统是Win2003(32位),内存16G。
采用Apache+Tomcat,Apache和Tomcat的连接使用mod_jk,不复制Session。
其中Tomcat开4个实例,因为是Session sticky,所以可以正常使用session。对于应用程序级别的共享资源,尽量避免,对于必须使用的情况,则设置独立于Web的服务,比如缓存等。 11 楼 xiaoyu 2009-09-30 可能楼主还想在服务器安装一个魔兽世界玩玩,所以就。。。。。要32位的OS。
12 楼 zhxp791008 2009-09-30 首先jvm的内存肯定不能开得太大,太大反而会导致应用暂停问题。
集群是个好的方案,在一台物理机器上开启几个应用。session的复制、fail恢复等,如果在你的应用中有定时器东东,建议两种方案:
1、定时器单独一个应用,只部署一个。
2、这个定时任务加入到数据的job中搞定,
我认为第二种方案更好。 13 楼 puroc 2009-09-30 直接换成64位的JDK。也不建议把一个JVM设置的过大。
1)在一个主机上部署多个应用是可以的。有的服务器,一个进程是根本没有办法完全利用系统资源的。所以可以部署多个,来提供对系统资源的利用。
2)定时器在每个JVM中都有,肯定会出现你说的问题。可参考quartz框架的集群方案。 14 楼 houniao 2009-10-03 xiaoyu 写道可能楼主还想在服务器安装一个魔兽世界玩玩,所以就。。。。。要32位的OS。
人家说的服务器32位的,莫非你能把32位字长的cpu虚拟成64位?
PS. 难道非得把内存全用完了才爽吗? 如果觉得jdk的最大内存还不够,不能结合其它cache手段,比如memcache来做呢。这样不也减轻了程序对jdk的内存占用。另外的32位os能支持这么多内存吗?