JVM内存管理及垃圾回收详解(5)

6、Serial Old。Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。

7、Parallel Old。Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

8、RTSJ垃圾收集器,用于Java实时编程,后续会补充介绍。

三、Java程序性能优化

gc()的调用

调用gc 方法暗示着Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间,调用System.gc() 等效于调用Runtime.getRuntime().gc()。

finalize()的调用及重写

gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时)。因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对栈上的对象进行内存回收就要靠finalize()。举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法调用free()。

优秀的编程习惯

(1)避免在循环体中创建对象,即使该对象占用内存空间不大。
(2)尽量及时使对象符合垃圾回收标准。
(3)不要采用过深的继承层次。
(4)访问本地变量优于访问类中的变量。

本版块会不断更新!

四、常见问题

1、内存溢出

就是你要求分配的java虚拟机内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
2、内存泄漏

是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越多,系统也不能再次将它分配给需要的程序,产生泄露。一直下去,程序也逐渐无内存使用,就会溢出。

本章内容以理论为主,后续我会不断地增加一些实际的操作,如验证垃圾回收效果、或者内存监测什么的,同时也希望读者会不断给出指导、建议,如有任何问题,请联系:egg:

邮箱:xtfggef@gmail.com

微博:weibo.com/xtfggef

如有转载,请说明出处(),谢谢!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a3fb10e63f17bf6399f40a8040d69c29.html