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 ...
随机推荐
- Vue-router的用法与使用步骤
Vue-router的使用步骤: Vue Router的使用步骤还是比较清晰的,按照步骤一步一步就能完成路由操作 A.导入js文件 B.添加路由链接 C.添加路由占位符(最后路由展示的组件就会在占位符 ...
- 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序.选择排序.快速排序.冒泡排序.归并排序.希尔排序.插入排序.桶排序.基数排序.计数排序算法,想要学习的你们,继续阅读下去吧,如 ...
- Oracle12C配置对外访问
Oracle12C配置对外访问 第一步: 开放端口或者关闭防火墙 第二步: 配置Oracle net manager打开Net manager 修改为共享服务器 第三步: 配置连接数打开Databas ...
- Q200510-03-03 :LRU缓存机制
LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...
- centos7图形化安装oracle11g
#设置主机名 hostnamectl set-hostname oracle #yum安装 yum -y install unzip vim* bash-completion bash-complet ...
- git多账号使用
1 背 景 在公司上班的员工会同时拥有两个git账号, 一个是公司内部的, 仅允许工作时使用; 另一个是个人的, 常用于日常的学习记录. 此时, 面临的问题是如何在一台电脑(客户端)上正常使用两个账号 ...
- Appium之常用API
Appium常用API解析 1.current_activity:获取当前页面的activity名,比如com.taobao.tao.TBMainActivity 或 com.taobao.brows ...
- appium的基本环境配置
1.先安装jdk1.7或jdk1.8之后,并配置好环境变量 2.安装Android SDK(安卓软件开发包),测试Android手机必然要安装Android SDK,例如android-sdk_r24 ...
- Java多线程1:进程与线程
进程和线程 讲线程和进程前,先讲下同步(Synchronous).异步(Asynchronous).并发(Concurrency).并行(Parallelism). 同步(Synchronous)和异 ...
- python基础入门语法和变量类型(二)
列表 列表是 Python 中使用最频繁的数据类型,它可以完成大多数集合类的数据结构实现,可以包含不同类型的元素,包括数字.字符串,甚至列表(也就是所谓的嵌套). 和字符串一样,可以通过索引值或者切片 ...