论坛首页 Java版

假设jvm分配的内存足够,大量长期对象会不会影响性能?

浏览 3167 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-04-20
nowind 写道
我了解如果在程序中产生大量的长期对象,可能会引起经常性的full gc,使系统性能变慢.

但是如果给jvm分配了足够的内存以保证不会引起full gc,并且长期对象的个数在100万以内,还会不会影响性能?

长期对象到底是怎么影响了系统性能的,这一点我不清楚,可否讲解一下?


32位JVM最大能调到2G左右 64位的理论上可以支持无限大
如果你这些对象之间关联不大 是不是可以把request mediate一下 索引这些对象 就可以开几个JVM了
   
0 请登录后投票
最后更新时间:2008-04-20
JVM内存主要分为 young区和old区
young区又分为 s0 , s1 和 edan 区
我们new一个新的对象时候都首先会保存在edan,如果edan区满了则会引发一次mirror gc, 采用copy算法进行edan区和s0区中拷贝存活的对象到S1区,(下次就是S1区拷贝到S0区),这时候采取的是悲观算法,需要old区中空闲的内存必须大于等于eden+s0区,否则就会引发一次full gc,这时就会出现服务无响应的情况

我想明白了这些,就可以调节相应的young区和old区来尽量减少full gc的次数
   
0 请登录后投票
最后更新时间:2008-04-21
antonyup_2006 写道
魔力猫咪 写道
首先,你要搞清楚长期对象的概念。顾名思义,长期对象就是长期存在的对象。
在Web应用中,对象的生命周期一般分临时、请求、Session、应用和服务器。其中应用和服务器级的对象是长期存在的,只要应用不停止或者停掉服务器,那么这些对象就一直存在。可以说是最长期的对象了。但是它们会经常引发垃圾收集吗?不会。
其实你说的长期对象其实是Java的内存泄露。对象本来在它自己的生命周期完成后应该被垃圾回收器收回,但是因为一些引用可以到达这些对象而造成无法回收,所以越来越多,最后造成经常全回收而且还回收不回来。最后崩溃。
长期对象的数量是由业务需要和机器性能决定的。理论上如果机器性能可以无限增长,那么当然不会存在任何问题。但是在实际过程中我们会受到硬件的制约。
JVM内存一般在2-4G。过2G的一般都不推荐。不然JVM的性能根本无法管理那么大的内存空间。你说的100W长期对象需要占用多少内存?这不但取决于你对象的数量也取决于你对象本身的大小。
绝大多数的对象都是临时和请求这一级数的。你要100W常住。我估计你准备超级计算机好了。

最近在关注spring aop和其他动态代理生成的代理对象的存放问题,动态代理产生的对象是在应用运行时候才才产生的,它是放在堆区呢还是防在永久分区?要是防在永久分区,gc能及时的回收吗?请教...

“类”信息都是放在permGen,就是永久区,不管是你自己写的类还是cglib生成的。jdk的bin下有一个工具可用于监测gc信息,你去找来看看(具体忘了,可能不是标准jdk/bin下的,反正有这么个工具)。
   
0 请登录后投票
最后更新时间:2008-04-21
需要多大的内存?
其实需要走到jvm tunning这一步的应该都是很特殊的情况了,一般来说都是通过cache和集群(多进程)技术来解决,大应用也是如此;
不过太过分的full gc确实让jvm卡得很厉害
   
0 请登录后投票
最后更新时间:2008-04-22
antonyup_2006 写道
恩,之前我和一个朋友讨论的是sun公司的,他们的系统出现了jvm内存泄露,我怀疑是他们过多的用了动态代理的技术,造成了一些动态对象的内存回收有问题,他们也在考虑换个jvm看看,但担心是否影响上层的东西 呵呵



按照JVM规范的说法,当所有类产生的实例都被回收后,Class也会被回收,所以动态创建的类比如Cglib创建的那些应该也是会被回收的。
   
0 请登录后投票
最后更新时间:2008-04-25
发送肯定是用IO的,没必要放到内存里,即使放在硬盘上性能也不会降低,只要比发送IO快就行了
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐