内存管理之GC
来源:互联网 发布:js隐藏button按钮 编辑:程序博客网 时间:2024/05/13 19:55
1.当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。
2.Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。
由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。
三.减少GC开销
根据上述GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:
1.不要显式调用System.gc()
此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。
2.尽量减少临时对象的使用
临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。
3.对象不用时最好显式置为Null
一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。
4.尽量使用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)
由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如 Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer 是可变长的,它在原有基础上进行扩增,不会产生中间对象。
5.能用基本类型如Int,Long,就不用Integer,Long对象
基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。
6.尽量少用静态对象变量
静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
7.分散对象创建或删除的时间
集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片, 从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC 的机会。
持续更新中……
- 内存管理之GC
- JVM基础 之java内存管理以及GC
- Android内存管理之java虚拟机的GC
- java内存管理以及GC
- JAVA 内存管理及GC
- JVM内存管理和GC
- JVM内存管理及GC
- 垃圾回收GC,内存管理
- JVM内存管理------GC简介
- JVM内存管理------GC简介
- JVM内存管理------GC简介
- jvm内存管理与gc
- java内存管理,GC,内存泄漏
- JVM之---GC内存分配
- .NET的GC内存管理与GC回收机制
- java内存管理以及GC工作原理
- Java 垃圾回收机制 [ 内存管理 GC]
- GC与显式内存管理
- git 项目提交顺序 和 分支的那些事
- Android四大布局之百分比布局
- iOS Widget && Today Extension 开发
- 库函数fopen/fgetc/fputc实现两个文件内容的复制
- Hibernate4视频教程
- 内存管理之GC
- 网络游戏专业术语中英文对照版
- Angular $http拦截器介绍与使用
- Web安全——XSS脚本注入攻击
- ArcGI Server+GP服务完成最短路径分析(实践经验)
- iptables详解
- Python求素数算法
- 计算当前的时间减去存的时间 求出分钟数
- SuppressWarnings