JVM学习之内存模型与GC算法

Java程序无需对内存进行分配和释放,内存的分配与释放由JVM来完成

JVM内存模型
线程独占:栈区,本地方法栈,程序计数器
线程共享:堆,方法区
java声明的变量内存存放位置
1.new出来的对象及数组存放在堆区,对字符串JVM进行了特殊处理,1.7以后首次在堆中创建,会将字符串的引用存放在方法区的字符串常量池中
2.函数中变量的声明存放于栈中,如果是对象引用,栈中保存的是指向堆区的引用地址
3.类变量存放在方法区

栈区:方法执行创建栈帧,存储局部变量表,操作数栈,动态链接,方法出口等信息
本地方法栈:native方法中的变量等,数据结构与栈区一致
方法区:类型信息(类完整名称,父类完整名称,类的直接实现接口,类的修饰符),运行时常量池(编译期间可以确定的值,final修饰的变量等),字段信息,方法信息,类变量(static变量),对类加载器的引用,对class类的引用,方法表
程序计数器:记录线程的字节码执行位置

栈区异常:1.线程的栈深度大于JVM锁允许的深度(StackOverflowError)2.内存不足(OutOfMemoryError)

GC搜索算法
1.引用计数算法:IOS中的ARC采用这种算法,缺点是无法解决循环引用问题
2.根搜索算法:设立若干种根对象,当任何一个根对象均不可达时,则认为这个对象是可以被回收的 (JVM采用)
可作为GC roots对象
栈(栈帧中的本地变量表)中引用的对象
方法区中的静态成员
方法区中的常量引用的对象(全局变量)
本地方法栈中JNI(一般来说的Native方法)引用的对象

GC清除算法
标记-清除算法:标记存活的对象,清除未被标记的对象,此过程需要暂停其他的线程。
递归与全堆对象遍历,效率低
清理后空闲内存不连续
复制算法——新生代
内存分两块,垃圾回收过程中把存活对象复制到未使用的内存块,清除正在使用的内存块中所有对象,交换两块内存角色
空间的浪费
标记—整理算法——老年代
标记存活对象,整理存活对象使内存空间连续,记录可使用内存区域的首地址。
效率不高

三种算法总结:
GC线程执行时需要暂停应用程序
效率比较:复制>标记-整理>标记-清除
内存连续性:复制=标记-整理>标记-清除
内存利用率:标记—整理=标记-清除>复制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值