2019独角兽企业重金招聘Python工程师标准>>>

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51388806,谢谢!

本文主要是基于Java内存回收机制作一些测试,目的是进一步了解JVM的相关机制。

您可能需要阅读:JAVA 内存泄露详解(原因、例子及解决),以便对Java中的内存管理有初步的认识。

总的来说,就是申请2次超过最大可用内存一半的内存,然后观察在不同情况下,会出现什么情况。

首先,我们都知道 Java 中 int 是 4 字节的,当然你也可以尝试一下:

System.out.println(Integer.BYTES); //输出:4

运行时,我们可以通过如下方式获取JVM最大的内存:

Runtime.getRuntime().maxMemory()

所以,想要一次分配超过最大内存一半的方式可以如下使用:

int[] ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)];


好,直接看第一个测试:

public static void test1(){ int[] ints1,ints2; ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; ints2 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; }

如果至少读了文章开始部分推荐的文章,那么至少可以分析得到如下结论:

为ints1分配内存时,肯定是没有问题的,因为有足够的内存可以使用,但是,在为ints2分配时,ints1的内存是不能被回收的,而调用test1()结果很显然:OutOfMemoryError。这个例子很简单,目的是由浅到深。要解决这里的问题,我们将代码修改为如下肯定就不会有问题了:

public static void test2(){ int[] ints1,ints2; ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; ints1 = null; ints2 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; }

因为对象被设为 null 就暗示GC可以清理这个对象了(但是GC不一定马上就会清理),然后在准备为ints2申请内存时,发现内存已经不足以功ints2使用了,所以马上启动GC开始清理工作(也可能会提前就启动了),所以,调用test2()是没有问题的。

那么如果例子是这样的呢:

public static void test3(){ int[] ints1; ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; }

在测试得到结果之前,先分析会有更多收获:我们知道暗示GC可以回收一个对象的内存,除了将对象设置为null,另一种情况就是对象被重新赋值,即这个对象原先申请的内存的访问方式(如果有c++基础,这个就太容易理解了)就被删除了。那么上面代码中,可能就有一点不好拿捏结果了:

  1. 要为ints1重新赋值(即,将它指向另外一块内存),就应该先分配好这块内存,然后才让ints1指向这块内存,即在第二次分配前,GC并不能回收ints1原先指向的那块内存,所以结论是连续两次分配了内存,在第二次分配时会出错,即调用test()3会发生OutOfMemoryError 。
  2. 编译器很容易(相对)知道,ints1要被重新赋值了,即使应该先分配内存,再让ints1指向它,经过优化后,可以先让GC释放掉之前申请的内存,然后再发生第二次内存的申请,所以结论是调用test()不会有任何问题。

不过,以上两点,也并没有冲突,我们直接调用,发现确实出现的是第一种情况(调用发生错误),但需要注意的是,我们平时一般都使用的是sun公司的jvm,其他jvm在没有真正测试过时,不能妄下结论(比如:IBM的jvm在调用上述test3时,就不会有任何问题)。

当然,sun公司的jvm,在运行如下例子时是肯定不会有问题的,IBM的jvm就更不用说了,因为这并不需要编译器(或JVM)有多智能:

public static void test4(){ int[] ints1; ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; ints1 = new int[1];//或者ints1 = null ints1 = new int[(int) (Runtime.getRuntime().maxMemory()*0.25*0.6)]; }

因为Java规范中,很多都不规定具体的实现,比如GC,所以他们的处理方式也很难相同。

而对于我们,应该了解其基本的原理,就像上面得出的两种结论,并不是单一的测试就能说明问题,而正确的分析(基于基本原理),一定是对的。

转载于:https://my.oschina.net/lvzunwei/blog/687873

对JVM GC进一步的实例解析相关推荐

  1. JVM GC原理解析

    JVM GC原理 1.JVM 的内存空间,从大的层面上来分析包含:新生代空间和老年代空间. 新生代空间又被分为2各部分(Eden区域.Survious区域) 和3个板块(1个Eden区域和2个Surv ...

  2. JVM GC日志解析

    在我们看GC日志时,我们需要对垃圾回收器的工作流程比较熟悉,这样比较方便我们查看gc日志,大家可以看看我上一篇GC理论. JVM启动参数: -Xmn2M 年轻代分配2M -Xmx6M 给java堆分配 ...

  3. 一文看尽 JVM GC 调优

    一个著名的学习方法论 向橡皮鸭求助 学会提问,提问也是一门艺术 提问前,先投入自己的时间做好功课 发生了什么事情 问题的基本情况 你投入的研究和发现 能正确提出你的问题,你的问题差不多已经解决一半 深 ...

  4. Kafka如何在千万级别时优化JVM GC问题?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.toutiao.com ...

  5. 面试官问:上亿数据量下,Kafka是如何优化JVM GC问题的?

    大家都知道Kafka是一个高吞吐的消息队列,是大数据场景首选的消息队列,这种场景就意味着发送单位时间消息的量会特别的大,那既然如此巨大的数据量,kafka是如何支撑起如此庞大的数据量的分发的呢? 今天 ...

  6. jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

    jvm gc(垃圾回收机制) Java JVM  垃圾回收(GC 在什么时候,对什么东西,做了什么事情) 前言:(先大概了解一下整个过程) 作者:知乎用户 链接:https://www.zhihu.c ...

  7. PCL中点云特征描述与提取精通级实例解析

    PCL中点云特征描述与提取精通级实例解析 1 3D对象识别的假设验证 2 隐式形状模型方法 2.1 隐式形状模型识别方法概述 2.2 实例解析 1 3D对象识别的假设验证   本教程将学习在高噪声和严 ...

  8. 性能测试能力提升-JVM GC原理

    目录 一.背景 二.JVM GC原理 2.1 什么是JVM 2.2 什么是GC 2.3 JVM体系结构中GC作用区域 2.4 JVM GC分代管理和流转过程 2.5 JVM GC收集器介绍 一.背景 ...

  9. java代码的执行机制+JVM+GC

    1.java源码编译机制 1.1 分析和输入到符号表(Parse and Enter) Parse:词法和语法分析 Enter:将符号输入到符号表 1.2 注解处理(Annotation Proces ...

  10. java服务器gc停顿_如何避免后台IO高负载造成的长时间JVM GC停顿(转)

    译者著:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下. 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是L ...

最新文章

  1. mongodb自带监控 mongostat数值说明
  2. Windows SDK程序的输出文字和格式控制(wsprintf、swprintf、Textout)
  3. Three.js学习笔记
  4. Asp.net中的HttpModule和HttpHandler的简单用法
  5. 工作占用了太多私人时间_下班后还要被逼谈工作,我们应该如何处理?
  6. php7 获取文件类型,太简单了!PHP获取文件扩展名的7中方法
  7. 这样写的,一定是辣鸡代码!
  8. Java中六种List集合循环遍历取值
  9. Parasoft C++test使用教程:执行测试用例(上)
  10. 【Oracle】回收站
  11. IDM下载百度资源出现403的解决方法
  12. cuda对应pytorh安装
  13. Linux学习笔记:常用100条命令(一)
  14. Cadence Allegro针对Shape进行Vertex推挤拉伸操作方法图文教程
  15. 关于安装QCAT/QXDM异常的问题
  16. 音量放大器--软件实现
  17. java 值班管理_​运维告警的值班管理
  18. Shell中的while用法
  19. JavaEE全套资料+视频+工具
  20. ih5学习笔记_事件对象

热门文章

  1. Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
  2. Atitit.android播放smb 网络邻居视频文件解决方案
  3. Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
  4. Atitit.实现继承的原理and方法java javascript .net c# php ...
  5. paip.语义分析--分词--常见的单音节字词 2_deDuli 单字词 774个
  6. paip.c++ 操作360浏览器总结..
  7. XSS跨站点脚本攻击解决方案
  8. Rust : Attribute 属性 作者:Mike Tang
  9. AI进军华尔街!《终极算法》作者Domingos加盟对冲基金巨头
  10. SQLite 时间格式化