@
RangerWolf 不好意思,上面说的有误, Linux 线程实现有几种,其中一种是使用进程来模拟线程,但使用 ps 看到的还是一个进程。
public static final String a = 'aaaa' ,这种,类加载器会把 'aaaa' 放到常量池中,类加载后,内存就不会释放,但不算是内存泄漏,这是因为:我们说的内存泄漏,主要是指动态分配了内存,不再需要的时候,应能释放,如果没有办法释放,就算内存泄漏,所以,比如一些程序就需要很大的内存空间,但这是正常使用,就不算内存泄漏。
如果连接池之类的这种池化技术,就是让一些资源不释放,使得下一次使用的时候速度更快,这就是故意这样设计的,这就不算内存泄漏。
但如果我是做一个程序,把文件文件中行读到一个 List 中去,使用完后,这个数据没有用了,应释放,但因为自己到这个 List 定义到一个类的 static filed 中去了,所以不会被 gc 到,这就算内存泄漏了。
内存泄漏也是相对的, 比如程序就那么几个泄漏,程序调用一次后也没有再调用过,泄漏了也没有关系,怕的就是频繁调用的地方有泄漏,最后让 jvm crash 了,这就严重了。
写程序的时候,一般的普遍 object (除超大的 String 外),泄漏也没有什么大的关系,最容易是 jvm crash 的是,把 object 不停的加入到 Collection 中。所以写程序注意一下超长的 String 及 Collection 的应用,少使用 static 变量(常量不算内存泄漏, static 作为性能优化常用,但在现代的 jvm 优化技术下,基本没有太大的必要),一般不会内存泄漏。