1 引用计数法
      给一个对象添加一个引用计数器,每当有一个地方引用时,计数器加1,当引用失效的时候,计数器减去1.当计数器为0的时候,表示对象不可能再被使用。此时表明该对象可以被回收。
    缺点:难以对象之间互相引用。

package com.dusk.service.jvm;/**
* @Authgor: gosaint
* @Description:
* @Date Created in 22:14 2018/9/10
* @Modified By:
*/
public class RefrenceCountingGC {public Object instance =null;private static final int _1MB=1024*1024;private byte[] bigSize=new byte[2*_1MB];public static void main(String[] args) {RefrenceCountingGC refrenceCountingGC1=new RefrenceCountingGC();RefrenceCountingGC refrenceCountingGC2=new RefrenceCountingGC();refrenceCountingGC1.instance=refrenceCountingGC2;refrenceCountingGC2.instance=refrenceCountingGC1;refrenceCountingGC1=null;refrenceCountingGC2=null;System.gc();}
}

 
  为JVM启动设置参数
  -XX:+PrintGCDetails-----------------------------表示详细的GC日志的输出

  运行后查看GC日志:

[GC (System.gc()) [PSYoungGen: 6764K->728K(38400K)] 6764K->736K(125952K), 0.0017376 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 728K->0K(38400K)] [ParOldGen: 8K->648K(87552K)] 736K->648K(125952K), [Metaspace: 3422K->3422K(1056768K)], 0.0083313 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Heap
PSYoungGen      total 38400K, used 998K [0x00000000d5f80000, 0x00000000d8a00000, 0x0000000100000000)eden space 33280K, 3% used [0x00000000d5f80000,0x00000000d6079b20,0x00000000d8000000)from space 5120K, 0% used [0x00000000d8000000,0x00000000d8000000,0x00000000d8500000)to   space 5120K, 0% used [0x00000000d8500000,0x00000000d8500000,0x00000000d8a00000)
ParOldGen       total 87552K, used 648K [0x0000000081e00000, 0x0000000087380000, 0x00000000d5f80000)object space 87552K, 0% used [0x0000000081e00000,0x0000000081ea22b8,0x0000000087380000)
Metaspace       used 3437K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 375K, capacity 388K, committed 512K, reserved 1048576K

来吧,分析吧。虽然看不懂但是还要看的。
      来看上述的图吧,java堆内存划分为新生代,老年代和永久代,但是在java8取消了永久代,出现了元空间。
Monitor GC:
        从Eden到survivor幸存者区域被回收的内存称为 Monotor GC。每次的Monitor GC 都会清除年轻代的内存。
        1 当JVM无法为新创建的对象分配内存空间时会触发Monitor GC。
        2 当Monitor GC的时候会出现“全世界的停顿”,(stop-the-world),停止应用程序的线程。对于绝大多数程序来说停顿延迟都是可以忽略不计的。
[GC (System.gc()) [PSYoungGen: 6764K->728K(38400K)] 6764K->736K(125952K), 0.0017376 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

1 GC开头的日志[GC和[full GC说明了垃圾这次回收停顿的类型。如果有"Full",表示这次GC发生了“stop-the-world”。这是因为使用System.gc()会触发Full GC.  Full GC是情理这个堆空间。
2 [PSYoungGen和[PSYoungGen表示GC发生的区域。分别代表使用Parallel Scavenge(并行收集)和Parallel Old收集新生代和老年代的垃圾回收组合。为什么是这两个垃圾回收的组合呢?因为我自己的JVM默认开启的模式是server.可以通过java -version来看垃圾回收组合。

  还有一种模式是client模式。默认使用Serial和Serial Old收集器的组合。
  3 在方括号中[PSYoungGen: 6764K->728K(38400K)] 后面的”6764K->728K( 38400K)”代表的是”GC前该内存区域已使用的容量->GC后该内存区域已使用的容量(该内存区域总容量)”。GC前使用了6.7M的空间,GC后使用了0.65M的堆空间。该内存的总容量为38.4M。
  4 后面的6764K->736K(125952K)表示:GC前该java堆已使用的容量->GC后该java堆已使用的容量(该内存区域总容量)”。GC前java堆使用了6.7M的空间,GC后使用了0.65M的堆空间。该java堆的总容量为125M。
  5 0.0017376 secs表示GC所用的时间,单位是秒,卡伊看出是毫秒级别。
  6  [Times: user=0.00 sys=0.00, real=0.00 secs]   user代表进程在用户态消耗的CPU时间,sys代表代表进程在内核态消耗的CPU时间、real代表程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待 I/O 完成)。
  7 当触发Full GC后,可以看出:PSYoungGen: 728K->0K(38400K)] [ParOldGen: 8K->648K(87552K)] 736K->648K(125952K),  新生代从来的728K变为0k,并且新生代内存不变。老年代从8k变化为648k.新生代的对象全部转移到老年代。老年代的内存为87M。java堆内存不变,但是从736k变为648k.因为触发了Full GC。因此回收了整个java堆的垃圾。
这里对元空间暂时不做描述。

转载于:https://www.cnblogs.com/gosaint/p/9637076.html

JVM 对象状态判断01相关推荐

  1. contentwindow无法搜索对象_面试官:讲一下Jvm中如何判断对象的生死?

    但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问,在 JVM 中如何判断一个对象的生死状态? 判断对象的生死状态的算法有以下几个: 1.引用计数器算法 引用计算器判断对象是否存活的算 ...

  2. 面试官:讲一下Jvm中如何判断对象的生死?

    但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问,在 JVM 中如何判断一个对象的生死状态? 判断对象的生死状态的算法有以下几个: 1.引用计数器算法 引用计算器判断对象是否存活的算 ...

  3. Jvm中如何判断对象的生死?

    但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问,在 JVM 中如何判断一个对象的生死状态? 判断对象的生死状态的算法有以下几个: 1.引用计数器算法 引用计算器判断对象是否存活的算 ...

  4. JVM 对象动态年龄判断

    JVM 对象动态年龄判断是怎么回事? 虚拟机并不是永远地要求对象年龄必须达到了-XX:MaxTenuringThreshold=15才能晋升老年代: 动态年龄判断: Survivor区的对象年龄从小到 ...

  5. java jvm对象_【Java】JVM

    在 HotSpot 虚拟机中,一个对象在内存中存储的布局可以分为三块区域:对象头(Object Header).实例数据(Instance Data)和对齐填充(Padding). 当我们在 Java ...

  6. JVM 动态年龄判断规则

    JVM 动态年龄判断规则 对象进入老年代的动态年龄判断规则(动态晋升年龄计算阈值):Minor GC 时,Survivor 中年龄 1 到 N 的对象大小超过 Survivor 的 50% 时,则将大 ...

  7. JVM - 对象的创建

    # JVM - 对象的创建 JDK版本:1.8 # 1.对象的创建的方式 Java语言中,对象创建的方式有六种: new关键字:最常见的形式.Xxx的静态方法.XxxBuilder.XxxFactor ...

  8. [Nhibernate]对象状态

    目录 写在前面 文档与系列文章 对象状态 瞬时态(Transient) 持久态(Persistent) 脱管态(Detached) 对象状态转换 总结 写在前面 前面两篇文章介绍了SchemaExpo ...

  9. Hibernate_2_Hibernate中对象状态及转化_一级缓存_Session详解_HQL/SQL/Criteria_一对多关系_级联操作

    Hibernate中的对象状态 在Hibernate中持久化对象具有三种状态: 瞬时态, 持久态, 游离态. 瞬时态: 对象没有与Hibernate产生关联(transient,session中没有缓 ...

最新文章

  1. 如何给Centos添加静态地址
  2. html 页面视图中的资源文件(css/js/image)的路径问题。
  3. 虚拟化基础架构Windows 2008篇之12-WSUS工作站端配置
  4. 分库分表 springboot+dubbo+mybatisPlus+shardingSphere
  5. Mysql初始化root密码和允许远程访问
  6. quill鼠标悬浮 出现提示_jQuery实现鼠标悬停显示提示信息窗口的方法
  7. Hadoop、storm和Spark的区别、比较
  8. php7从基础到商业实战,TP5从基础到项目实战全套
  9. Android开发BroadcastReceiver广播的使用
  10. centos有用的命令
  11. 使IE6支持png透明图片
  12. linux shell读取文件,shell脚本中读取文件的方法
  13. 2021全国大学生电子设计大赛题目汇总
  14. 主流地信遥感数据导航
  15. 新手兼职也能月入5000的副业项目,几乎零门槛
  16. 使用WPS邮件合并功能和文档部件插入图片制作准考证
  17. Keil代码折来叠功能显示与隐藏!!!
  18. 让Vim打造成强大的IDE,附_vimrc的配置和使用
  19. 一招学会绘制UI图标超椭圆
  20. Bailian2713 肿瘤面积

热门文章

  1. python从1到n出现了多少个1-Python解决 从1到n整数中1出现的次数
  2. python好学吗mooc中文网-Python全栈工程师
  3. python编程入门与案例详解pdf-Python入门之三角函数sin()函数实例详解
  4. php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...
  5. 千万级到10亿+的疯涨,搜狗商业平台服务化体系实践之路
  6. CHD-5.3.6集群上hive安装
  7. 【Python学习】使用Pyinstaller将py文件导出为exe文件
  8. iOS-获取通讯录联系人信息
  9. 异步的两种写法: async 与 BeginInvoke
  10. 《高可用MySQL》2 – 单机版MySQL主从配置