看JTS源码,感受Java优化编程(一)(二)

2014-11-24 01:25:07 · 作者: · 浏览: 1
用,然后强制释放,将资源流出来给其他对象,当程序需要在此使用这对象得时候要么从softReference(其实也可以看作是简单缓存)中将原有对象还原,要么由于被GC回收了软引用,再重新初始化一次。。。。(所以说研究出Java的人都是火星上来的,居然考虑得如此周密)

弱引用方法河软引用方法一样。他们之间得区别在于弱应用能更快得被GC给回收,毕竟软应用只是再内存使用到达警戒水平的时候才会进行。结合JTS目标是处理空间数据以及空间拓扑,它处理的对象很多都是一种Map结构的对象,这种对象会占用大量的内存空间,所以我们很好理解JTS为什么做了这么多我们平时再代码中从来不注意的事情。但是这不代表因为我们的系统目标和JTS不一样,所以我们就可以不去做这些工作。

  • 不可视阶段

什么样的对象可以将其认定为不可视阶段呢?举个例子吧,在try{...}catch(Exception){...}代码中,如果在try的代码块中声明了一个obj,那么当整个 try{...}catch(Exception){...}代码段执行完毕以后这个obj实际上就已经属于不可视阶段了。在JTS源码中我看到很多这样的例子,大师们会在try代码块的最后多一句话:obj=null;实际上这种方式我也使用过,但是99%的时候都用所谓的项目时间紧张为借口忽略了。其实多这么一句话将obj对象置为空值可以快速的帮助JVM发现这个对象,并进行回收以释放资源。这里也有一部分代码是使用的SoftReference来处理,呵呵,大师的风格也不尽相同呀。

当然,即便没有这句话最终这个对象会被GC给回收,但是快速的释放资源就可以有效的提高现有资源的利用效率,这个难道真的不应该被我们这些使用高级编程语言进行开发的程序员所提倡吗?资源永远都是有限的,并非只是汇编或是做嵌入式开发的程序员才应该关注程序使用资源的问题的!改编周星星名言-“程序不是这样写的!资源不是这么用的!”

  • 不可到达/回收释放阶段

一个对象混到这份上就也该知足了,也该自觉一点轻轻走了算了,就算不走GC作为警察(户籍警察)也会对此对象实施强制消户了。。。一般情况下我还是不相信这个世界上有鬼存在的,那些怎么打也打不死的青铜圣斗士除外。。。。

其他方面据不完全统计的个人经验而言,在开发过程中做到1、不提前创建对象,什么时候用什么时候创建;2、数组创建时尽可能避免显示申请数据的内存空间;3、当对象占用资源大&对象数据稳定&对象生命周期长可能的使用静态变量;4、使用IDE编译代码的时候在程序的发布版本编译时去掉IDE默认的debug编译模式(Eclipse:窗口-首选项-java-编译器)、在需要同类大量对象的时候,使用对象池,数据库连接池即在次范围。。。。。。同时没有事情的时候多多学习大师的代码,java开源社区有很多值得学习代码风格的源代码等待着我们呢:)

附上代码来解释一下堆内存和栈内存的区别

(阅读许可证:本实例代码未满18岁或家有女王者勿入,由本代码引起的一切纠纷、人身伤害以及法律问题需阅读者自行解决,原创作者 sinoly 不承担任何责任。一旦阅读本代码,就表示你已接受本许可所提出的所有观点)

public class 我的老婆们 {

static Vector 老婆s = new Vector(); // 创建一个老婆的Vector序列

static void 娶个老婆() {

PLMM plmm = new PLMM(); // 请首先new一个PLMM对象

老婆 wife = (老婆)plmm ; // 不作此做出方法解释,涉及到太多问题

老婆s.AddElement(老婆); // 本方法多次运行可实现了一夫多妻的宏伟目标,也是本人长期努力的方向

}

public static void main(String[] args) {

娶个老婆(); // 执行此方法可能会带来内存溢出,请慎重!

}