温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中怎么使用JVM实现内存管理

发布时间:2021-06-30 17:59:08 来源:亿速云 阅读:185 作者:Leah 栏目:编程语言

Java中怎么使用JVM实现内存管理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1. 查找失效对象

1.1 引用计数法

        可以为每一个对象添加一个引用计数器,用于存储当前对象被几处引用。

        引用计数法简单高效,但无法解决循环引用问题,如A引用B,B又引用A,且这两个对象不再被其它对象引用,那么在使用引用计数法的情况下,这两个对象的引用数均为1,且无法减至0。

1.2 可达性分析算法

        可以通过一系列成为“GC Roots”的对象作为起始点,并从这些节点向下搜索,当一个对象到GC Roots不可达,则证明该对象不可用。

        Java中怎么使用JVM实现内存管理

                            图1-1

        GC Roots对象包括下面几种:      

        o 虚拟机栈中引用的对象。

        o 方法区中类静态属性引用的对象。

        o 方法区中常量引用的对象。 

        o 本地方法栈中引用的对象。   

        一个对象要真正被清理,至少需要两次标记过程。

1.3 回收方法区

        方法区垃圾回收的效率与性价比都远低于堆内存的回收。

        主要回收两部分:废弃常量和无用的类。

2. 垃圾收集算法

2.1 标记-清除算法

        Java中怎么使用JVM实现内存管理

                                            图2-1

        标记清除算法的标记阶段与清除阶段效率都不高,且会产生大量内存碎片。

2.2 复制算法

        Java中怎么使用JVM实现内存管理

                                            图2-2

        将内存平分为两块,每次只使用其中一块。

        当一块内存快用完时,可将存活的对象复制到另一块上面,然后将刚才使用的内存一次性清理掉。

        该算法简单高效,且不会产生内存碎片,但由于有一半空闲内存,所以内存使用率不高。

        HotSpot中,新生代内存结构为 1 * Eden + 2 * Survivor,每次只使用Eden区和其中一块Survivor区,当发生回收时,会将Eden与在用的Survivor中的存活对象复制到另一块Survivor区中。

        根据HotSpot的内存结构,可见只有10%的内存(其中一块Survivor)被浪费,但此时有另一个问题,即实际情况下我们不能保证每次回收的存活对象都仅占内存的10%以下,所以当Survivor也不够用时,就需要依赖其它内存(老年代)做分配担保。

2.3 标记-整理算法

        在对象存活率高的情况下,复制算法需要进行较多的赋值操作,效率会变低,同时备用空间也是对内存的一种浪费。

        对于老年代,可能存在所有对象都存活的情况,所以直接使用复制算法是不合适的,所以出现了标记-整理算法。

        Java中怎么使用JVM实现内存管理

                                                  图2-3

看完上述内容,你们掌握Java中怎么使用JVM实现内存管理的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI