jvm 虚拟机内存分配模型?
1.堆内存(heap):java对象存储空间,创建对象开辟堆内存空间,存储对象的成员,空间只能被垃圾回收器回收,不会自动回收,内存占用超过98%,回收只能2%,内存溢出。
2.栈内存(stack):java中局部变量或者形式参数的存储空间,方法调用开辟空间,方法执行结束,空间自动释放,如果递归方法或者死循环会导致栈内存溢出
3.方法区:方法区又被称为永久区,线程共享,是用来存储已被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
4.本地方法区
5.程序计数器
堆和栈的区别?
功能方面:堆是用来存放对象的,栈是用来执行程序的。
共享性:堆是线程共享的,栈是线程私有的。
空间大小:堆大小远远大于栈
说一下 JVM 有哪些垃圾回收算法?
标记-整理算法:标记无用算法,让所有存活的对象都向一端移动,然后直接清楚掉端边界以外的内存。
复制算法:按照容量划分为二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后在把已使用的内存空间一次清理掉。
缺点:内存使用率不高,只有原来的一半
分代算法:根据对象存活周期的不同,将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法
jvm 虚拟机的垃圾回收机制?
1.jvm的垃圾回收机制后很多方法和垃圾回收器,我只了解分代管理法和清楚标记法
2.在jvm内存中有新生代,年老代,永生代,新生代中又包含Eden和survival,幸存者有两块内存区域,但是使用时,仅一个区域可用,另一块幸存者内存区必须为空。
3.当创建对象时,会首先在Eden中开辟新的空间,如果Eden的内存区域不够用,无法开辟新的内存空间,则会对Eden进行扫描,然后标记,垃圾回收器此时会找出那些内存在使用中,还有那些不是,垃圾回收器要检查所有的对象,对需要清楚的对象进行标记,清理垃圾回想,然后把保留的对象拷贝到survival幸存者区域
4.如果Eden和survival新生代内存区域全部存满,这时候对整个新生代内存区域进行扫描,将需要清楚的对象进行标记,进行清除,将其他对象拷贝到年老代,这种GC称为YoungGC
5.如果年老代内存区域也存满,需要对整个内存区域进行扫描,对对象进行标记,清除新生代和年老代内存区域,将垃圾对象清除,这种GC称为FullGC
6.垃圾回收器分为串行回收器,并行回收器,并发回收器,串行垃圾回收器单线程,效率低,并行和并发回收器为多线程,但是并发回收器会造成程序阻塞,所以使用并行回收器进行垃圾回收,过程中会产生垃圾回收碎片,会自动转换为串行垃圾回收器,清理完碎片,自动转换为并行垃圾回收器,不会对程序造成影响