今晚就遇到了一个,装PS的时候,看到提示安装64位的会更好用一些。机器决定的吧,估计在JVM内部设置的32位和64位所占用的最大内存不一样。

解决方案 »

  1.   

    顶一个~
    前两天也看了相关内容,大概意思是说,32位的操作系统,它的寻址最大就是2的32次方的内存空间了,内存分配多了就超出范围,超出部分还是寻不到的。因此,jdk或者tomcat在校验初始化内存大小的时候,会考校这个系统位数的(这块是推论的)。
      

  2.   

    有第三方缓存插件,可以使用。如memcache
      

  3.   

    首先你把表里的东西都加载到内存当中,这本身就不合理。就不能分页查询?
    其次32位操作系统,支持内存到4G,而系统已经占用一部分内存,所以你的程序可用内存更少。而且如果是32位系统,你插入8G/16G内存条,可识别内存也不会超过4G。
      

  4.   

    从你的这个问题看,即使给了你64位系统也不一定能解决你的问题。这么大的数据量全部加载到内存的HashMap中,这种设计肯定是有问题的。HashMap虽然通过hash值进行了快速定位的优化,但是归根到底HashMap的定位方式还是遍历,小数据量定位很快,但是大数据量性能将会非常的差,性能远没有数据库的索引采用Btree之类的结构搜索来的快。所以可能你是想优化系统,结果把系统给优化到坑里了。
      

  5.   

    我很奇怪,公司为什么要你这个完全不懂系统设计的人去优化项目。看你对内存和架构的理解,似乎无法完成这个工作...一个6GB数据的表,是不可以这样放入内存的- -。而且很多时候,也不需要这种优化,通常只要建立索引和一些逻辑处理上的优化基本上就能适用所有的业务系统。如果并发量实在大,流量巨大,实在是数据太频繁适用,那就要硬件的支持和良好的设计了,就算数据使用很频繁,也不可能6GB数据都很频繁- -,只要统计出6GB中哪些频繁然后缓存就可以了,就像java的内存回收机制。如果是数据分析系统的话,我只能告诉你,以你目前的硬件配置还无法完成任务,当然还需要一个针对性的设计以及大量的代码优化,着同样不是以你现在的水平能够完成的,需要一个很资深的在大数据处理上有经验的人来处理。
      

  6.   


    我当时也纳闷的不行啊看机器明明是12G内存。但是确实是32位的。
    我纠正一下,32位不是只能支持4G的。如果开启PAE的话,最大支持64G。只是一个进程最多只能寻址4G的内存。所以,tomcat作为一个进程,无法使用大于4G的空间。可能是这个原因吧。。
      

  7.   

    java虚拟机的内存大小跟系统有关,一般64位的大于32位,linux系统大于window系统的
      

  8.   

    还是无法理解将这么大的数据放入内存。如果要优化的话,可以首先考虑对于当前数据库查询方式的优化,或者从头处理一下应对逻辑。
    我机器也是32位的,4G内存,不能都用,现实的hi3.17G可用。
      

  9.   

    32位的系统,开了PAE的确是有超过4G内存可用量显示的,不过你tomcat用的JDK应该是32位的,另外,也不清楚这种开了PAE的32位系统是否支持64位JDK,估计是不支持的。
    64位系统,你装32位JDK,我印象中最多也只能用4G,而且如果是windows系统的话,很可能4G都用不到,应该是tomcat直接就起不来了
    楼主你的需求,可能需要的是一个搜索引擎来提高性能
      

  10.   

    嗯,跟大家说下。问题解决了,是另外一个地方没考虑到导致的空指针。给大家一个建议就是看帖子要看仔细点。。我明明说的是:
    真是郁闷的不行,然后用servlet访问一个接口,就报NullPointerException,我估计是因为数据没加载到内存,这个接口一查发现数据是空的,然后就扔过来一个异常。(这是我猜的,希望你能根据经验给我判断一下。。)所以,如果有经验的应该马上知道不是内存的问题,而是什么地方抛出了异常。所以,在网上跟一个大牛描述了一下,他立即说跟内存无关,是你空指针问题。然后我定位以后发现果然是有个地方忘记判断了。这才是我想要的答案。总之,也学到了很多东西,谢谢大家!结贴