JVM 内存分配和占用
我们从一个简单示例来引出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 内存分配和占用的更多相关文章
- JVM 内存分配模型概念和java中各种对象的存储
JVM 内存分配模型概念 --在工作中可能用到的机会不多,有个概念的了解 --此文是转载某位读者,应该是在阅读了<深入理解Java虚拟机JVM高级特性与最佳实践> 一书后,总结所得.写的不 ...
- 一个可以参考的JVM内存分配
下面是java命令有关JVM内存分配的参数 JAVA_MEM_OPTS="" BITS=`java -version >& | -bit` if [ -n " ...
- 第二章 JVM内存分配
注意:本篇博客,主要参考自以下四本书 <分布式Java应用:基础与实践> <深入理解Java虚拟机(第二版)> <突破程序员基本功的16课> <实战java虚 ...
- Android性能调优篇之探索JVM内存分配
开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...
- JVM内存分配及String常用方法
一,JVM内存分配和常量池 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的.如下图所示(注意:在jdk1.8之后便没有方法区了): 如上JVM将内存分为 ...
- 浅谈JVM内存分配与垃圾回收
大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...
- 最简单例子图解JVM内存分配和回收
一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...
- JVM内存分配与垃圾回收机制管理
项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...
- Linux下tomcat运行时jvm内存分配
tomcat运行时jvm内存分配 ⑴开发环境下在myeclipse中配置-Xms256m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:PermSi ...
随机推荐
- Flutter Toast消息提示框插件
Flutter Toast消息提示框插件 在开发flutter项目中,想必大家肯定会用到toast消息提示,说到这里, 大家肯定会想到https://pub.dev/ 插件库, 但是插件市场上有太多类 ...
- 15_Python的模块module
1.模块的概述 1.模块是Python程序架构的一个核心概念,每一个以.py结尾的Python源代码文件都是一个模块 2.模块名和标识符的命名规则一样,由数字字母下划线组成且不能以数字开头,也不要和系 ...
- House of Orange
题目附件:https://github.com/ctfs/write-ups-2016/tree/master/hitcon-ctf-2016/pwn/house-of-orange-500 查看程序 ...
- Linux下mysql安装记录
1.MySQL下载路径:https://dev.mysql.com/downloads/ Linux下的安装步骤:http://www.runoob.com/linux/mysql-install-s ...
- “未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决方案
不论是连接Access数据库或是SQL Server数据库,"未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序."这个问题从Of ...
- flask提交表单验证不通过,以及CSRF攻击原理
学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...
- [程序员代码面试指南]递归和动态规划-排成一条线的纸牌博弈问题(DP)
题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获 ...
- 复习 | 彻底弄懂Flexbox之Demo篇
flexbox之前有接触,写项目时也用过,但也只是简单的,对其也是似懂非懂,所以今天下定决心把这个再学一遍,因为似懂非懂就是不懂 本文主要是的demo演示,想看flexbox语法 请移步flexbox ...
- maximo----对比竞品的优势,以及sp的优势
众多资产密集型企业对eam产品关注度都很高,尤其是eam产品的功能差别,这与行业差别有直接关系,如电力行业.煤炭行业或石油行业等,各行有各行的运营特点,那么eam产品在共性的基础上定出存在细小差异.下 ...
- JVM-概述和内存区域
目录 JVM的优势 Java的跨平台性 JVM跨语言 举个例子 JVM整体结构 运行时数据区 方法区(Method Area) 1. 什么是方法区(Method Area)? 2.方法区(Method ...