- 论坛徽章:
- 8
|
1. 你知道怎么样的代码可以帮助GC减负吗?
(1)不要显式调用System.gc()
此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。
(2)尽量减少临时对象的使用
临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。
(3)对象不用时最好显式置为Null
一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。
(4)尽量使用StringBuffer,而不用String来累加字符串
由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer是可变长的,它在原有基础上进行扩增,不会产生中间对象。
(5)能用基本类型如Int,Long,就不用Integer,Long对象
基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。
(6)尽量少用静态对象变量
静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
(7)分散对象创建或删除的时间
集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC的机会。
2. 程序内存溢出了,应该怎么办?我们应该怎样写代码,才能更好的帮助程序在出问题时,尽快定位问题?
OOM是一种Crash,只要能达成触发条件,就无法阻止发生。OOM主要有两种原因,一种是泄漏(慢性),一种是非泄漏(急性),一般来说只有非泄漏的OOM可以在log里打印异常,泄漏则需要在项目交付之前用Leak Canary检测
3. 多线程编程总能提高程序性能吗?使用时需要注意什么 ?
多线程并发的目标是提升整体性能,但是使用多线程也会造成一些额外的开销,比如线程之间的协调、上下文切换、线程的创建和销毁、线程调度。如果多线程的性能比实现同功能的性能还差,那就是一个很糟糕的并发设计
要想通过多线程并发来获得更好的性能,主要做好两个事情:更有效的利用现有处理资源、在出现新的处理资源时使程序尽可能地利用这些新资源,就是尽可能使CPU处于忙碌状态(并不是做无用功),最终的目标就是对资源充分的利用,充分有效的利用就能发挥资源的最大价值,就能最大的提高性能。比如程序是计算密集型可以通过增加处理器来提高性能,如果一个线程不能使CPU一直处于忙碌状态,那么就应该使用多线程使CPU处于忙碌状态 |
评分
-
查看全部评分
|