>>如果一个web服务器在session地处理上那么弱智会内存耗尽地话
显然不会那么弱智的耗尽了,因为过了一段时间session就超时了,如果没有超时这一说,就是硬盘也会被放满了

服务器端怎么知道那些session是在用的?它最多根据上次访问时间做一些优化,把较长时间不用但是又没有超时的session钝化到硬盘上,但这是特定服务器的事情,而且不一定就能显著的提高效率

兄弟,你对session的运行机制和体系不是很清楚。找些资料看看吧,如果有兴趣。

你们说的是http session spec还是HttpSession还是SessionEJB?

兄弟,如果你觉得我是错的,能不把理由说的详细一些

我自己做了一个实验
tomcat4.0.6 win2k server
有这么一个JSP,访问的时候放一个10M的StringBuffer变量在session上

<%
System.out.println("1");
StringBuffer sb = new StringBuffer(10*1024*1024);
for(int i=0;i<10*1024*1024;i++){
sb.append("1");
}
session.setAttribute("sb",sb);
System.out.println("2");
%>

Tomcat启动后,在任务管理器中看见内存占用和虚存占用分别是
34M 36M

启动一个IE访问该页,变为
53M 62M

关闭原来的IE,启动一个新的访问该页,变为
74M 79M

关闭原来的IE,启动一个新的访问该页,结果OutOfMemory

经过一段时间,原来的两个session超时,变为
20M 78M

整个过程中我仔细检查了硬盘使用量,没有任何变化

请问如何解释?

是Http session

> 正在使用地session是在内存中地,已不再使用,但没有过期?> session是存放在硬盘地指定目录地。并且正在使用地session

对不起,我觉得这是不对的。session没有“使用中”这个概念。只有valid/invalid。

> 理论地争论没有意义。

同意。不要讲“回”字的4种写法。

> apache地临时目录中去找一下session文件到处都是。

各种webserver实现http session的方式各不相同,不过硬盘肯定不如内存快地球人都知道吧。


> 我自己做了一个实验
> tomcat4.0.6 win2k server
> 有这么一个JSP,访问的时候放一个10M的StringBuffer变量在
> ession上
>

嗯,很实践的方式。说句题外话,你的tomcat版本太低了,新的不好么?

>> 正在使用地session是在内存中地,已不再使用,但没有过期?> session是存放在硬盘地指定目录地。并且正在使用地session
>对不起,我觉得这是不对的。session没有“使用中”这个概念。只有valid/invalid。

说的好

>嗯,很实践的方式。说句题外话,你的tomcat版本太低了,新的不好么?
4.0.6是4.0.X中最新的版本了,我不喜欢4.1.XX因为它启动的时候废话太多,我也没注意过它们之间的区别,5.0.X还是Alpha版

晕。
快成了意气之争了。
你的内存是256的话,你放N多的session超过256看看。

使用虚存和使用硬盘还是不一样的哦。

另外你说的意气是指什么?我们都是萍水相逢,谈谈技术而已。我不同意你的观点是因为我的经验,不是因为哪个人的。

"Don't get personal~"

哦。上边的帖子只是说上边are you ok?的帖子的。

session的基本机制,可以查资料找到。

但sesison的具体实现在各种服务器中是有差异的。apache至少是这么处理的。如果你创建了了一个session,那么在临时目录中会有一个已此session id名字命名的文件。当session过期后这个文件会被自动删除。
争论的起因是偶说session并不是完全和内存相关的,海量访问时服务器会有自己的session处理及缓存机制,绝对不会因为session带来内存耗尽的问题。上边那个帖子只是说写一个程序去访问的试验是没有意义的。
jrun也是这种机制。
websphere只是用过,没留意这个。
weblogic没用过。

呵呵,全都因为我的一句话
“session永不过期是愚蠢透顶的做法,session将只增不减,你有多少内存?”
开始这场讨论的,我并不认为这句话有什么错误,session永不过期是不可能的,我认为服务器应该根本不允许这么做,这样没有意义,就算放在硬盘里面也会满的

session中的东西肯定首先是放在内存里的,也许有的服务器会做优化,如果session超时时间较长,可能将长时间不用又还没有超时的session放到硬盘里面,那是特定的服务器的事情,而且我不认为这样可以提高多少效率

另外就是你说的apache是指apache server还是tomcat
作为一个静态页面的服务器,apache server里面session的概念有什么用?

这次争论还发现了一个有意思的现象
就是我做那个实验的时候为什么会OutOfMemory呢?
我的内存是512M,当时内存用量已经接近512M但是还有虚存啊,是因为StringBuffer太大了?
每次将10M的变量放上去,内存用量增20M,多的10M是没有收集的垃圾吗?我没有生成新对象啊,还是StringBuffer中的append方法内部用的零时变量?

我认为在这里只是讨论而已,如果我完全是对的,那么讨论结束后我一无所获,如果我每次都是对的,那我就不必来了

兄弟,不要哪tomcat试来试去。
tomcat说到底只是一个免费的jsp/servlet容器而已。拿来做开发阶段的测试服务器可以,至少商业应用上我们公司还从来不给客户用这种东西。

你把tomcat插入到apache中或者使用webspher、weblogic这些经过大规模商业应用检验的服务器来试。

偶使用eclipse加入tomcat4.0.6的插件调试程序时总是出莫名其妙的错误,明明是好的,但就是出错,重起几次机子就有好了。简直FT。
使用VJ下的webshpere的时候从来没有这些乱七八糟的事情。

把tomcat插到apache里面去
我觉得session还是tomcat来管理的

webshpere之类的东西太慢,我们用的就是webshpere,但我不认为我们公司做的是企业级应用,虽然他们这么号称,唯一的好处的出来莫名其妙的毛病就可以把责任推到ibm那里去
有几个公司真正的在做大型的企业级应用?不过是跟风罢了,J2EE就四个字母谁都会吹……

我讨厌这种作风