性能优化:
1,如何去优化自己现有的项目,运行更加流畅。
app进程 16M,32M,64M
2,以后开发项目的时候就要从一开始就要做好。
-----------------------------内存泄漏----------------------------------------
C/C++自己去分配内存和释放内存----手动管理
malloc free
什么是内存泄漏,内存不在GC掌控之中,当一个对象已经不再使用了,本该被回收时,
而有另外一个正在使用的对象持有它的引用,从而就导致对象无法被回收。
这种导致了本该被回收的对象不能被回收,而停留在堆内存中,就产生了内存泄漏。
了解java内存回收机制:某对象不再有任何引用的时候才会进行回收。
了解内存分配的几种策略。
1,静态的
静态的存储区,内存在程序编译的时候已经分配好,这块内存在程序整个运行期间都一直存在。
它主要存放静态数据,全局的static数据和一些常量。
2,栈式的。
在执行函数(方法)的时候,函数一些内部变量的存储都可以放在栈上面创建,函数执行结束
的时候这些存储单元,就会自动释放掉。
栈内存包括分配的运算速度很快,因为内置处理器的内部。当然容量比较有限。
3,堆式的
也叫做动态内存分配。有时候可以用malloc或者new来申请分配一个内存,在c/c++可能要自己负责
释放(java中直接以来gc的机制)
在c/c++中是可以自己掌控内存的,需要有很高的素养来解决内存的问题,java这一块没有很好的方法
来解决垃圾内存,需要的时候编程的时候就要注意自己良好的编程习惯。
区别:
堆是一些不连续的内存区域,堆空间比较灵活,也比较大。
栈是一些连续的内存空间,大小是操作系统决定的。
堆管理很麻烦,频繁的new/remove会造成大量的内存碎片,这样就会慢慢导致效率低下。
对于栈的话,他先进后出,进出完全不会产生碎片,运行效率很高,且稳定。
public class Main{
int a = 1; // 堆中 成员变量
Student a = new Student(); // 堆中 成员变量
public void XXX(){
int b = 2; // 栈中 局部变量
Student b = new Student(); // 局部变量
}
}
1,成员变量全部存储在堆中,(包括基本数据类型,引用的对象实体)----因为他们属于类,
类对象最终还是要被new出来的。
2,局部变量的基本数据类型和引用存储于栈当中,引用的对象实体也是存储在堆当中,----
因为他们属于方法中的变量。生命周期会随着方法一起结束。
我们讨论的内存泄漏,主要是堆内存,它存放的就是引用指向的对象实体。
软引用,若引用,虚引用,
有时候确实会有一种情况,当需要的时候可以访问,当不需要的时候可以被回收,也可以被暂时
保存,以备重复使用,
比如:listView或者GirdView,RecycleView加载大量数据或者图片的时候,图片非常占用内存,
不然很容易造成内存溢出,滑出去的内存就回收,节省内存,看listView的源码-----回收对象
还会重用convertView,如果用户反复滑动或者下面还有同样的图片,就会造成多次重复IO(很耗时)
那么需要缓存,----平衡好内存大小和IO,算法和一些特殊的java类。
算法:LRUcache(最近最少使用先回收)
特殊的java类:利于回收,StrongReference,SofeReference,WeakReference,PhantomReference.
StrongReference 强引用,
回收时机:从不回收,使用,对象的一般保存,生命周期:JVM停止的时候才会终止,
SofeReference. 软引用,
回收时机:当内存不足的时候,使用,SofeReference<String>结合ReferenceQueue构造,有效期短。
生命周期:内存不足时终止。
WeakReference. 弱引用,
回收时机:在来及回收的时候GC的时候,使用,同软引用,生命周期:GC后终止。
PhantomReference 虚引用
回收时机:在垃圾回收的时候,使用,结合ReferenceQueue来跟踪对象被垃圾回收器回收的活动,
生命周期:GC后终止。
开发时,为了防止内存溢出,处理一些占用内存大并且生命周期长的对象的时候,可以尽量使用软引用
和若引用,
软引用比LRU算法更加任性,回收量是比较大,你无法控制回收哪些对象。
比如使用的场景,默认头像,默认图标,
listView或者GirdView,RecycleView要使用内存缓存,外部缓存(SD卡)
-----------------------------------内存泄漏例子-------------------------------------------
单例模式导致内存对象无法释放而导致内存泄漏。