虽说Java是有内存管理的,但内存溢出的现象在平常的工作中仍时有遇到。现发帖问个开放性问题:Java在编码中避免内存溢出的方法/编码规范,大家有何高招呢?
要求:撇开System.gc()不谈只能发200分的帖子,欢迎回复。感谢感谢...

解决方案 »

  1.   

    以前看过点,做得小节如下~
    http://blog.csdn.net/czp0608/article/details/7352024
    接点分~
      

  2.   

    楼主,很遗憾的说:System.gc() 不是用来防止内存溢出的。其次:Java的内存管理,跟你程序内存溢出,并没有啥关系。不好听的说,有点:拉不出粑粑赖茅坑了。核心问题还是:你是怎么用内存的?目的、手段、代价与收益评估。
    如果要细化讨论的话,建议楼主你至少说下你的应用是什么类型的,特点是什么?
      

  3.   


    1.不谈及gc()是因为gc()也只是请求需要回收,不是立即执行回收;另gc()真正一执行,应用的其它动作都暂停了。所以关系不大,也是要求避谈的原因。
    2.管理不好就溢出了,正如没有茅坑只能路边蹲啰,在用户面前多难堪啊...
    3.怎么使用内存?也是我想请教大家的。我自己设置缓冲区,在对象的创建、重复利用、回收上尽可能优化。
    4.我碰到的应用情形是:需要用到大量图片包括gif,涉及数据库。
    最后,如何体面找到茅坑拉粑粑,请多指教!!感谢
      

  4.   

    1.不谈及gc()是因为gc()也只是请求需要回收,不是立即执行回收;另gc()真正一执行,应用的其它动作都暂停了。所以关系不大,也是要求避谈的原因。...这个可能你有点误区了,这个是否暂停取决于你所选择的gc,现在确实有多线程的,就是你在写内存的时候也可能有在回收。其实不是必要的,个人觉得没必要缓存,虽然效率有所提高,但是服务器鸭梨太大后很容易导致系统不稳定。
      

  5.   


    这个就比较具体了,根据你所说的片段,大致对现状理解是:
    1、你应用中需要提供海量图片供用户访问,这些图片是动态增长的(比如:用户上传的);
    2、目前这些图片放在了数据库中。
    尚不清楚的是:这些图片的访问是否存在权限控制。
    那么先假定图片一旦上传,就任何人都可以访问,这种情况下比较常规的做法,是将图片直接从数据库中静态化到文件系统中,然后设置Apache或EngineX直接提供访问服务即可;必要的时候,可以启用Apache的内存缓存能力。如果图片存在权限控制需求,则是另一种做法,看你是哪一种再细化探讨。
      

  6.   

    补充说下:Java不是万能的,架构师所关注的其实就是:完整考虑信息系统的全过程环节,尽可能用各种成熟技术去解决不同的问题,统一规划、扬长避短。
      

  7.   


    判断系统是否支持多线程?是操作系统级别吗?
    System.getProperty("os.name")和System.getProperty("os.arch")判断操作系统(这个要知道什么操作系统支持多线程才行)
    或者看看ThreadMXBean的isThreadCpuTimeSupported()能不能判断?判断垃圾回收器是否有效?
    for (GarbageCollectorMXBean gcm : ManagementFactory.getGarbageCollectorMXBeans()) {
        System.out.println(gcm.getName() + "-" + gcm.isValid());
    }
      

  8.   

    1.尽量使用直接量
    2.使用StringBuilder和StringBuffer进行字符串连接
    3.尽早释放无用对象的引用
    4.尽量少用静态变量
    5.避免在经常调用的方法、循环中创建Java对象
    6.缓存经常使用的对象
    7.尽量不要使用finalize方法
    8.考虑使用SoftReference