java内存管理机制
内存泄漏 内存溢出 内存抖动:
话术整理 首先java的内存管理机制 gc的垃圾回收机制,然后引出leakcanary,总分总的回答思路
java内存模型划分
c,c++主要就是系统 鞥直接操作内存, android底层是linux linux的底层也是c或者c++
java性能优化,内存+cup+gpu(图像渲染)
java程序执行过程()
堆内存:new (对象) (强引用) 成员变量的存在堆中,局部变量存在栈中,方法存在栈中 局部变量new 的方法存在堆中,只不过生命周期短
native本地方法声明关键字,只有声明没有实现,在哪里实现呢?
在c或者c++里面实现
java的jni
因为java是跨平台的,Java本生有逻辑,不可避免的和其他语言打交道
jni和ndk的流程:ndk是c或者c++的核心库,类似java的jdk,类似于android 的sdk的概念
jbi调用c c调用ndk,实现不同语言之间的数据交互
静态变量<static的变量生命周期最长,随着应用的消亡而消亡
application他就是一个静态变量,所以不建议使用今天变量,
activity启动过程,从桌面系统点击图标到主入口activity的显示的过程
创建10个线程,cpu是线程执行的处理器,线程是cpu调度执行的最小单元
一个cpu实现不了并行,()
多线程并发,貌似并发,实际上是假象.cpu有一个时间片,每个时间片是毒瘤的执行单元
并发和并行的区别(同一个时间点同时执行)
cpu内部有很多的进程,每个进程 就相当于一个独立的app 他们的数据时隔离的
每个进程由分为多个线程,(真正执行任务的角色就是线程),线程和进程的占用太多,都会造成cpu的压力特别大
==程序计数器==,是唯一一个不存在内存溢出的内存区域,因为这是系统的,需要指令排序
内存回收:GC垃圾回收机制
对象存活判断
1.引用计数算法
给对象添加一个引用计数器,被引用的时候+1,引用失效-1,o的时候就说明没有任何引用(回收)
2.可达性算法
将"GC Roots"对象作为起始节点,向下搜索,搜索走过的路径为引用链;当一个对象到GC Roots没有引用链时,则该对象是不可用的;
可作为"GC Roots"的对象:
1.方法区中静态属性引用的对象
2.方法区中常量引用的对象
3,虚拟机栈引用的对象 (栈帧中本地变量表)
4.本地方法栈中JNI引用的对象 (Native方法)
2.垃圾回收算法
标记清除算法:
先标记要回收的对象,最后统一回收;碎片化严重 逐个标记,导致空间无法充分的利用
适用:存活对象较多的垃圾回收
缺点:
【1】,效率低; 标记和清除的过程效率不高;
【2】,空间问题;