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. 爷青回!16年前“打球AI”意外走红,程序员留下了自己的ICQ和MSN
  2. 解决fatal: 不是一个 git 仓库(或者任何父目录)的方法
  3. Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)
  4. SQL Server安全(11/11):审核(Auditing)
  5. 零基础学习hadoop到上手工作线路指导(中级篇)
  6. 关于预编译和Stdafx.h的若干问题
  7. 压力测试过程中MySQL服务CPU占用率过高的问题排查思路
  8. 优学院java架构52破解_2021年优学院Java程序设计(山西工程职业学院)课后习题答案...
  9. 并查集路径压缩_并查集专题
  10. 贪心算法 看这一篇就够了
  11. ln多少等于2用计算机,ln2(log计算器在线)
  12. Android 第三方登录之支付宝登录
  13. javascript实现锁定网页、密码解锁效果(屏幕保护效果)
  14. android什么意思!读完我这份《Android开发核心源码精编解析》面试至少多要3K!面试建议
  15. 计算机应用说课稿,中职计算机说课稿
  16. 2021年中国智能驾驶行业研究报告
  17. 马斯洛人类需求五层次理论
  18. 2019华师在线计算机,华师计算机基础客观作业2019.pdf
  19. cocos-creator学习笔记1(旋转,位置移动,键盘监控移动基础)
  20. Python之查询天气小程序

热门文章

  1. paip.截屏功能流程说明
  2. Rust: String 与 str
  3. 浙江大学公共管理学院与阿里云计算有限公司达成合作 | 凌云时刻
  4. 听说3月15日深圳有场存储盛宴,约吗?
  5. 【图像分割】基于matlab遗传算法优化K聚类图像分割【含Matlab源码 1605期】
  6. 【图像隐写】基于matlab GUI DCT变换图像隐写【含Matlab源码 1380期】
  7. 【优化算法】粒子群工具箱函数优化算法【含Matlab源码 1126期】
  8. 【声源定位】基于matlab阵列流形矩阵信号显示【含Matlab源码 549期】
  9. 【图像去噪】基于matlab非局部均值(NLM)滤波图像去噪【含Matlab源码 420期】
  10. SPSS 相关分析(图文+数据集)【SPSS 023期】