我们从一个简单示例来引出JVM的内存模型

简单示例

我从一个简单示例谈起这一块,我在看一篇文章的时候看到这么一个场景并且自己做了尝试,就是分配一个2M的数组,使用Xmx即最大内存为12M的话,会报错Java heap space,但是如果Xmx为13M的话这块便能正常执行 代码如下

public class Main {

static final int SIZE=210241024;

public static void main(String[] a) throws InterruptedException {

int[] i = new int[SIZE];

Thread.sleep(30000);

System.out.println("hahahha");

}

}

原因探究

数组占用大小

int数组占用的大小为8M 因为一个int占用4个字节,所以210241024*4 相当于8M。

那么相当于8M在当JVM最大为13M的时候是可以的 12M的时候是放不下的 那么JVM 是具体怎么组成和分配的呢

查看JVM的具体分配

我觉得比较直观的是使用

jmap -heap pid

这种方式来查看。可以看我上述代码,为了方便查看,我们sleep了30S的时间。

然后我们执行 java -Xmx13M -jar loaddata-0.0.1-SNAPSHOT.jar时,通过jps 找到其pid 就可以看到相关的占用情况了

JVM具体的内存分配

通过上述 jmap -heap pid 的方式 按照Xmx13M 我们查询到了如下所示

Heap Usage:

PS Young Generation

Eden Space:

capacity = 3670016 (3.5MB)

used = 2526440 (2.4094009399414062MB)

free = 1143576 (1.0905990600585938MB)

68.84002685546875% used

From Space:

capacity = 524288 (0.5MB)

used = 524288 (0.5MB)

free = 0 (0.0MB)

100.0% used

To Space:

capacity = 524288 (0.5MB)

used = 0 (0.0MB)

free = 524288 (0.5MB)

0.0% used

PS Old Generation

capacity = 9961472 (9.5MB)

used = 9130440 (8.707466125488281MB)

free = 831032 (0.7925338745117188MB)

91.65753816303454% used

根据这个提发现 JVM的组成其实由2块

Young Generation 和 Old Generation,他们两个默认比例是1:2.

而Young Generation又分为Eden Space From Space和 to Space

这里还涉及到一个大对象内存分配的问题

JVM的内存首先是往young Generation分配的。但是如果像上述这种大的对象(像上述这种8M数组,而JVM的young Generation是装不下的),就会直接放到old Generation里面.

由上面观察可知,8M的int数组直接放到了old Generation。

结论

根据上面的一些测试得出结论,8M的int数组在放入JVM的时候,由于12M 或者13M的JVM的young Generation均放不下,所以直接放到了old Generation。

然后13M JVM的old Generation可以放的下8M的int数组,但是12M的JVM的old Generation放不下8M的int数组,所以造成了这个情况。(12M的JVM的old Generation的大小可以自己测试查看,也可以按照2/3进行计算,加上old Generation原有的一些内存占用,可以推断出是不可以的)

0人点赞

JVM

作者:Await往生

链接:https://www.duitang.com/people/?user_id=1743587208

来源:堆糖

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

JVM 内存分配和占用的更多相关文章

  1. JVM 内存分配模型概念和java中各种对象的存储

    JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了<深入理解Java虚拟机JVM高级特性与最佳实践> 一书后,总结所得.写的不 ...

  2. 一个可以参考的JVM内存分配

    下面是java命令有关JVM内存分配的参数 JAVA_MEM_OPTS="" BITS=`java -version >& | -bit` if [ -n " ...

  3. 第二章 JVM内存分配

    注意:本篇博客,主要参考自以下四本书 <分布式Java应用:基础与实践> <深入理解Java虚拟机(第二版)> <突破程序员基本功的16课> <实战java虚 ...

  4. Android性能调优篇之探索JVM内存分配

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  5. JVM内存分配及String常用方法

    一,JVM内存分配和常量池 ​ 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的.如下图所示(注意:在jdk1.8之后便没有方法区了): ​ ​ 如上JVM将内存分为 ...

  6. 浅谈JVM内存分配与垃圾回收

    大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...

  7. 最简单例子图解JVM内存分配和回收

    一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...

  8. JVM内存分配与垃圾回收机制管理

    项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...

  9. Linux下tomcat运行时jvm内存分配

    tomcat运行时jvm内存分配 ⑴开发环境下在myeclipse中配置-Xms256m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:PermSi ...

随机推荐

  1. 关于js重名方法的先后调用问题

    当js中方法重名时,最后引入的js会覆盖前面的引入的js(就是说会调用最后引入的js中的方法)详情参照(main.js与white.js 的a())但是,当最后一个js中存在语法上的错误时(也可以是本 ...

  2. MySQL 增删查改 必知必会

    MySQL 数据库中的基础操作 3.表的修改 对表的表名.字段.字段类型.字段长度.约束等进行修改. 3.1 表的名称修改 -- 语法: ALTER TABLE 库名.表名 RENAME TO 新表名 ...

  3. linux:apache-配置基于域名的虚拟机主机

    一个http服务要配置多个站点,就需要用到虚拟机主机. 虚拟机主机一般有三类:1.基于域名 2.基于端口 3.基于ip 举例操作基于域名配置三个站点: 域名 站点目录 www.eejind.com   ...

  4. C#开发PACS医学影像处理系统(六):加载Dicom影像

    对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3 ...

  5. [LeetCode]Sql系列4

    ##题目1 626. 换座位 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id. 其中纵列的 id 是连续递增的 小美想改变相邻俩学生的座位. ...

  6. v-charts 绘制柱状图、条形图、水球图、雷达图、折线图+柱状图,附官网地址

    v-charts 官网地址:https://v-charts.js.org/#/ 柱状图: <template> <ve-histogram :data="chartDat ...

  7. vue单页面条件下添加类似浏览器的标签页切换功能

    在用vue开发的时候,单页面应用程序,而又有标签页这种需求,各种方式实现不了, 从这个 到这个,然后再返回上面那个 因为每个标签页的route不一样,导致组件重新渲染的问题,怎么都不知道如何实现... ...

  8. Mybatis的几种传参方式,你了解吗?

    持续原创输出,点击上方蓝字关注我 目录 前言 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 总结 前言 前几天恰好面试一个应届生,问了 ...

  9. 为什么我选择MySQL Workbench・一

    一.官方 官方提供的工具必然有其优势. MySQL Workbench有两个版本,社区版和商业版.社区版是免费的. 二.第一个选择 使用MySQL之前用的是SQL Server而微软的东西一般都使用微 ...

  10. Nginx【常见知识点速查】

    文章更新时间:2020/04/10 一.简介 定义:Nginx是一个高性能的HTTP和反向代理web服务器 作用: 反向代理 正向代理 负载均衡 HTTP静态资源服务器(动静分离) 二.正向代理与反向 ...