这篇文章主要讲解了“JVM内存模型与垃圾回收知识点整理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM内存模型与垃圾回收知识点整理”吧!
本文的主要内容如下:
内存模型
垃圾回收
这几个存储区最主要的就是栈区和堆区,那么什么是栈什么是堆呢?说的简单点,栈里面存放的是基本的数据类型和引用,而堆里面则是存放各种对象实例的。
堆与栈分开设计是为什么呢?
栈存储了处理逻辑、堆存储了具体的数据,这样隔离设计更为清晰
堆与栈分离,使得堆可以被多个栈共享。
栈保存了上下文的信息,因此只能向上增长;而堆是动态分配
栈的大小可以通过-XSs设置,如果不足的话,会引起java.lang.StackOverflowError的异常
线程私有,生命周期与线程相同。每个方法执行的时候都会创建一个栈帧(stack frame)用于存放 局部变量表、操作栈、动态链接、方法出口。
存放对象实例,所有的对象的内存都在这里分配。垃圾回收主要就是作用于这里的。
堆得内存由-Xms指定,默认是物理内存的1/64;最大的内存由-Xmx指定,默认是物理内存的1/4。
默认空余的堆内存小于40%时,就会增大,直到-Xmx设置的内存。具体的比例可以由-XX:MinHeapFreeRatio指定
空余的内存大于70%时,就会减少内存,直到-Xms设置的大小。具体由-XX:MaxHeapFreeRatio指定。
因此一般都建议把这两个参数设置成一样大,可以避免JVM在不断调整大小。
这里记录了线程执行的字节码的行号,在分支、循环、跳转、异常、线程恢复等都依赖这个计数器。
类型信息、字段信息、方法信息、其他信息
总结
栈区 | 线程私有,使用一段连续的内存空间 | 存放局部变量表、操作栈、动态链接、方法出口 | -XSs | StackOverflowError OutOfMemoryError |
堆 | 线程共享,生命周期与虚拟机相同 | 保存对象实例 | -Xms -Xmx -Xmn | OutOfMemoryError |
程序计数器 | 线程私有、占用内存小 | 字节码行号 | 无 | 无 |
方法区 | 线程共享 | 存储类加载信息、常量、静态变量等 | -XX:PermSize -XX:MaxPermSize | OutOfMemoryError |
有两种方式,一种是引用计数(但是无法解决循环引用的问题);另一种就是可达性分析。
判断对象可以回收的情况:
显示的把某个引用置位NULL或者指向别的对象
局部引用指向的对象
弱引用关联的对象
这种方法优点就是减少停顿时间,但是缺点是会造成内存碎片。
这种方法不涉及到对象的删除,只是把可用的对象从一个地方拷贝到另一个地方,因此适合大量对象回收的场景,比如新生代的回收。
这种方法可以解决内存碎片问题,但是会增加停顿时间。
最后的这种方法是前面几种的合体,即目前JVM主要采取的一种方法,思想就是把JVM分成不同的区域。每种区域使用不同的垃圾回收方法。
上面可以看到堆分成三个区域:
新生代(Young Generation):用于存放新创建的对象,采用复制回收方法,如果在s0和s1之间复制一定次数后,转移到年老代中。这里的垃圾回收叫做minor GC;
年老代(Old Generation):这些对象垃圾回收的频率较低,采用的标记整理方法,这里的垃圾回收叫做 major GC。
永久代(Permanent Generation):存放Java本身的一些数据,当类不再使用时,也会被回收。
这里可以详细的说一下新生代复制回收的算法流程:
在新生代中,分为三个区:Eden, from survivor, to survior。
当触发minor GC时,会先把Eden中存活的对象复制到to Survivor中;
然后再看from survivor,如果次数达到年老代的标准,就复制到年老代中;如果没有达到则复制到to survivor中,如果to survivor满了,则复制到年老代中。
然后调换from survivor 和 to survivor的名字,保证每次to survivor都是空的等待对象复制到那里的。
这种收集器就是以单线程的方式收集,垃圾回收的时候其他线程也不能工作。
以多线程的方式进行收集
大致的流程为:初始标记--并发标记--重新标记--并发清除
大致的流程为:初始标记--并发标记--最终标记--筛选回收
感谢各位的阅读,以上就是“JVM内存模型与垃圾回收知识点整理”的内容了,经过本文的学习后,相信大家对JVM内存模型与垃圾回收知识点整理这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。