For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了Java编程开发垃圾回收算法的一些基础知识等内容,而本文我们就继续来了解一下,Java虚拟机内存分配策略应用分析。
一、JVM如何判断一个对象可以被回收
判断一个对象是否存活有两种方法:
(1)引用计数法
所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收.
引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象A引用对象B,对象B又引用者对象A,那么此时A,B对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。
(2)可达性算法(引用链法)
该算法的基本思路就是通过一些被称为引用链(GCRoots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为(ReferenceChain),当一个对象到GCRoots没有任何引用链相连时(即从GCRoots节点到该节点不可达),则证明该对象是不可用的。
GCRoot对象有四种对象:
1、jvm栈中的引用对象
2、方法区中的引用静态常量
3、方法区中的普通引用常量4、native方法中的引用对象
一个对象经过两次标记为垃圾对象,该对象才会被判定为垃圾对象。
二、JVM内存分配与回收策略
内存分配:
(1)栈区:栈分为java虚拟机栈和本地方法栈
(2)堆区:堆被所有线程共享区域,在虚拟机启动时创建,目的存放对象实例。堆区是gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden区,主要放新创建对象,Fromsurvivor和Tosurvivor保存gc后幸存下的对象,默认情况下各自占比8:1:1。
(3)方法区:被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(permanmentgeneration)
(4)程序计数器:当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。线程私有的。
回收策略以及MinorGC和MajorGC:
MinorGC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的,所以MinorGC非常平凡,一般回收速度也比较i快。
MajorGC/FullGC是老年代GC,指的是发生在老年代的GC,出现MajorGC一般经常会伴有MinorGC,MajorGC的速度比MinorGC慢的多。
(1)对象优先在堆的Eden区分配。
(2)大对象直接进入老年代。
(3)长期存活的对象将直接进入老年代。
当Eden区没有足够的空间进行分配时,虚拟机会执行一次MinorGC.MinorGC通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度比较快;FullGc/MajorGC发生在老年代,一般情况下,触发老年代GC的时候不会触发MinorGC,但是通过配置,可以在FullGC之前进行一次MinorGC这样可以加快老年代的回收速度。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。