’内存管理‘

10 篇文章 0 订阅

updating

《深入理解java虚拟机》《深入Java虚拟机》

程序计数器(Program Counter Register)较小的空间,当前线程所执行字节码(java方法)的行号指示器,线程私有,生命周期同线程。

本地方法栈(Native Method Stacks)与虚拟机栈区相似,JVM调用Native方法。

runtime内存分配:静态存储区(方法区):线程共享。内存在程序编译的时候就已经分配好。主要存放static (会被作为GC的根节点(活跃的引用),被引用时触发类的加载操作,类加载过程会初始化类的所有静态变量,若静态变量初始化失败,将导致类加载失败,并抛出java.lang.ExceptionInInitializerError,若try/catch住它,下次new类对象时将产生java.lang.NoClassDefFoundError) 数据和常量,类信息、编译器编译后的代码等,另有一个常量池(字面量:含字符串、final的常量值等;符号引用:类和接口的全限定名,字段名和描述符,方法名和描述符)。


虚拟机栈(队列,连续):线程私有,生命周期同线程,超过变量的作用域后/执行结束时这些存储单元自动被释放,可立刻被另作他用。每个java方法(字节码)被执行时都会创建一个栈帧(Stack Frame)存储局部变量表、操作栈、动态链接、方法返回地址等,每个方法被调用直至执行完成对应着一个栈帧在虚拟机栈中从入栈到出栈。效率高,容量相对小。(寄存器,局部变量的生命周期在 Dalvik VM 跟 ART/JVM 中区别?)


堆区 (不连续,链表,两大块:一块 Young Generation(一个Eden Space主要存放新生对象;两个Survivor Spaces(from、to:它们大小总是一样,未使用的其一存放每次垃圾回收(Copying算法,较mark-compact快:每次使用eden与其中的一块survivor,当这块用完了,就将其中活的对象复制到另一块survivor(满了再拷贝到Old Generation中)并清理eden与用过的survivor)后存活的对象) ),另一块OldGeneration(主要存放生命周期长的对象,有的可能是多次yong GC后存活下来的,回收一般用mark-compact算法,但减少内存要求)态内存并发分配:线程共享,运行时用malloc或new申请任意大小的内存,存new的对象(包括该对象中的所有成员变量)和数组。



垃圾(从root搜索不到,且第一次标记、清理后,仍是死的对象)(回收时机eden满了minor gc,升到老年代的对象空间大于老年代剩余空间就full gc,或小于时被HandlePromotionFailure参数强制full gc。OOM通常发生于OLD段或Perm段垃圾回收后仍无空间容纳新对象/gc与非gc耗时超过了GCTimeRatio的限制):Tracing识别(主流,找出所有活对象并把其余对象所占空间认定为“无用处”):GC Roots的对象(栈中引用的对象,static/常量对象,本地方法栈中Native方法的引用对象)为起始点搜索(搜索所走过的路径为引用链),当一个对象到GC Roots没有任何引用链相连,即从GC Roots到这个对象不可达,则此对象是不可用的,可到达的对象就被判定为存活, 比如young区属于“收集部分”,old为“非收集部分”,那么从old指向young的引用就必须作为young GC的GC roots的一部分,所以young GC的GC roots比full GC的大;引用计数法:给对象添加一个引用计数器,有一个地方引用它时计数器就加1;引用失效时值减1;任何时刻计数器都为0的对象就是不可能再被使用的,弊如互相引用;


(Thread对象例外,注意对象容器)软引用:生命持续到full回收,可做缓存方案,可与一个引用队列(ReferenceQueue)联合使用,若软引用所引用的对象被gc回收,虚拟机就会把这个软引用加入到与之关联的引用队列中;弱引用:比软更短暂的生命周期,保持到垃圾回收器线程扫描到它时,可联合引用队,如new WeakHashMap<Object, Object>().put(new Object()为null时,gc‘经过’即回收, new Object());;虚(无)引用(PhantomReference):任何时候可能被回收,检测对象是否已从内存中删除,必须和引用队列联合用,比Object.finalize()灵活,gc准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中,new PhantomReference<Object>(new Object(), new ReferenceQueue<Object>()).get();永为null,虚拟机不负责清理虚引用,但会把虚引用放到引用队列里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值