Java在编码中避免内存溢出的方法/编码规范 讨论 虽说Java是有内存管理的,但内存溢出的现象在平常的工作中仍时有遇到。现发帖问个开放性问题:Java在编码中避免内存溢出的方法/编码规范,大家有何高招呢?要求:撇开System.gc()不谈只能发200分的帖子,欢迎回复。感谢感谢... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 以前看过点,做得小节如下~http://blog.csdn.net/czp0608/article/details/7352024接点分~ 楼主,很遗憾的说:System.gc() 不是用来防止内存溢出的。其次:Java的内存管理,跟你程序内存溢出,并没有啥关系。不好听的说,有点:拉不出粑粑赖茅坑了。核心问题还是:你是怎么用内存的?目的、手段、代价与收益评估。如果要细化讨论的话,建议楼主你至少说下你的应用是什么类型的,特点是什么? 1.不谈及gc()是因为gc()也只是请求需要回收,不是立即执行回收;另gc()真正一执行,应用的其它动作都暂停了。所以关系不大,也是要求避谈的原因。2.管理不好就溢出了,正如没有茅坑只能路边蹲啰,在用户面前多难堪啊...3.怎么使用内存?也是我想请教大家的。我自己设置缓冲区,在对象的创建、重复利用、回收上尽可能优化。4.我碰到的应用情形是:需要用到大量图片包括gif,涉及数据库。最后,如何体面找到茅坑拉粑粑,请多指教!!感谢 1.不谈及gc()是因为gc()也只是请求需要回收,不是立即执行回收;另gc()真正一执行,应用的其它动作都暂停了。所以关系不大,也是要求避谈的原因。...这个可能你有点误区了,这个是否暂停取决于你所选择的gc,现在确实有多线程的,就是你在写内存的时候也可能有在回收。其实不是必要的,个人觉得没必要缓存,虽然效率有所提高,但是服务器鸭梨太大后很容易导致系统不稳定。 这个就比较具体了,根据你所说的片段,大致对现状理解是:1、你应用中需要提供海量图片供用户访问,这些图片是动态增长的(比如:用户上传的);2、目前这些图片放在了数据库中。尚不清楚的是:这些图片的访问是否存在权限控制。那么先假定图片一旦上传,就任何人都可以访问,这种情况下比较常规的做法,是将图片直接从数据库中静态化到文件系统中,然后设置Apache或EngineX直接提供访问服务即可;必要的时候,可以启用Apache的内存缓存能力。如果图片存在权限控制需求,则是另一种做法,看你是哪一种再细化探讨。 补充说下:Java不是万能的,架构师所关注的其实就是:完整考虑信息系统的全过程环节,尽可能用各种成熟技术去解决不同的问题,统一规划、扬长避短。 判断系统是否支持多线程?是操作系统级别吗?System.getProperty("os.name")和System.getProperty("os.arch")判断操作系统(这个要知道什么操作系统支持多线程才行)或者看看ThreadMXBean的isThreadCpuTimeSupported()能不能判断?判断垃圾回收器是否有效?for (GarbageCollectorMXBean gcm : ManagementFactory.getGarbageCollectorMXBeans()) { System.out.println(gcm.getName() + "-" + gcm.isValid());} 1.尽量使用直接量2.使用StringBuilder和StringBuffer进行字符串连接3.尽早释放无用对象的引用4.尽量少用静态变量5.避免在经常调用的方法、循环中创建Java对象6.缓存经常使用的对象7.尽量不要使用finalize方法8.考虑使用SoftReference java的强制转换是如何实现的 求教一个JAVA regex的问题,高手进... 请问用JAVA读取几万条EXCEL2003的数据做分析,速度快不快? java做图形客户界面怎么做啊?急!!! ajax做的,用select表单提交到数据库仅点过的项通过 急,求教关于在计算器中加入括号的算法 初级问题:怎样实现关闭windows? JNI调用链接错误 有没有人对jxta感兴趣的,一块儿交流? jre如果不设java_home就形同虚设吗? 高手帮我看看我这段代码怎么解决空指针异常啊 窗口关闭问题
http://blog.csdn.net/czp0608/article/details/7352024
接点分~
如果要细化讨论的话,建议楼主你至少说下你的应用是什么类型的,特点是什么?
1.不谈及gc()是因为gc()也只是请求需要回收,不是立即执行回收;另gc()真正一执行,应用的其它动作都暂停了。所以关系不大,也是要求避谈的原因。
2.管理不好就溢出了,正如没有茅坑只能路边蹲啰,在用户面前多难堪啊...
3.怎么使用内存?也是我想请教大家的。我自己设置缓冲区,在对象的创建、重复利用、回收上尽可能优化。
4.我碰到的应用情形是:需要用到大量图片包括gif,涉及数据库。
最后,如何体面找到茅坑拉粑粑,请多指教!!感谢
这个就比较具体了,根据你所说的片段,大致对现状理解是:
1、你应用中需要提供海量图片供用户访问,这些图片是动态增长的(比如:用户上传的);
2、目前这些图片放在了数据库中。
尚不清楚的是:这些图片的访问是否存在权限控制。
那么先假定图片一旦上传,就任何人都可以访问,这种情况下比较常规的做法,是将图片直接从数据库中静态化到文件系统中,然后设置Apache或EngineX直接提供访问服务即可;必要的时候,可以启用Apache的内存缓存能力。如果图片存在权限控制需求,则是另一种做法,看你是哪一种再细化探讨。
判断系统是否支持多线程?是操作系统级别吗?
System.getProperty("os.name")和System.getProperty("os.arch")判断操作系统(这个要知道什么操作系统支持多线程才行)
或者看看ThreadMXBean的isThreadCpuTimeSupported()能不能判断?判断垃圾回收器是否有效?
for (GarbageCollectorMXBean gcm : ManagementFactory.getGarbageCollectorMXBeans()) {
System.out.println(gcm.getName() + "-" + gcm.isValid());
}
2.使用StringBuilder和StringBuffer进行字符串连接
3.尽早释放无用对象的引用
4.尽量少用静态变量
5.避免在经常调用的方法、循环中创建Java对象
6.缓存经常使用的对象
7.尽量不要使用finalize方法
8.考虑使用SoftReference