Java GC 内存

Posted hannahhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java GC 内存相关的知识,希望对你有一定的参考价值。

1.JAVA GC机制

GC主要回收堆内存:转自https://blog.csdn.net/antony9118/article/details/51375662

堆内存:存储JAVA中的对象和数组,New的对象;队列先进先出;运行时动态分配大小

栈内存:主要用来执行程序用的,比如基本类型变量和对象的应用对象;栈先进后出;存取速度快,仅次于寄存器,栈数据可共享。缺点是栈数据的大小和生存周期必须是确定的。

栈内存为一级缓存,可由JAVA GC回收

下面是一些在实际写程序的过程中应该注意的点,养成这些习惯可以在一定程度上减少内存的无谓消耗,进一步就可以减少因为内存不足导致GC不断。类似的这种经验可以多积累交流:

  1. 减少new对象。每次new对象之后,都要开辟新的内存空间。这些对象不被引用之后,还要回收掉。因此,如果最大限度地合理重用对象,或者使用基本数据类型替代对象,都有助于节省内存;
  2. 多使用局部变量,减少使用静态变量。局部变量被创建在栈中,存取速度快。静态变量则是在堆内存;
  3. 避免使用finalize,该方法会给GC增添很大的负担;
  4. 如果是单线程,尽量使用非多线程安全的,因为线程安全来自于同步机制,同步机制会降低性能。例如,单线程程序,能使用HashMap,就不要用HashTable。同理,尽量减少使用synchronized
  5. 用移位符号替代乘除号。eg:a*8应该写作a<<3
  6. 对于经常反复使用的对象使用缓存;
  7. 尽量使用基本类型而不是包装类型,尽量使用一维数组而不是二维数组;
  8. 尽量使用final修饰符,final表示不可修改,访问效率高
  9. 单线程情况下(或者是针对于局部变量),字符串尽量使用StringBuilder,比StringBuffer要快;
  10. String为什么慢?因为String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。如果不能保证线程安全,尽量使用StringBuffer来连接字符串。这里需要注意的是,StringBuffer的默认缓存容量是16个字符,如果超过16,apend方法调用私有的expandCapacity()方法,来保证足够的缓存容量。因此,如果可以预设StringBuffer的容量,避免append再去扩展容量。如果可以保证线程安全,就是用StringBuilder。示例下面两个示例·:

以上是关于Java GC 内存的主要内容,如果未能解决你的问题,请参考以下文章

Java内存管理和GC学习GC

Java内存以及GC

Java GC 内存

Android内存优化1 了解java GC 垃圾回收机制3

Java 内存区域和GC机制

Java GC 机制与内存分配策略