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 ...
随机推荐
- JS 进制转换的理解
该事情的由来是来自于一个面试题,题目是这样的,[1,2,3].map(parseInt)的结果是什么? 作为菜鸟的我们一定是觉得分别把1,2,3分别交给parseInt,无非就是1,2,3嘛.其实结果 ...
- Oracle重做日志和日志挖掘
重做日志-Redo log 首先给出参考资料: 1.Oracle官网-Managing the Redo Log 为什么需要redo log 内存中数据修改后,不必立即更新到磁盘---效率 由日志完成 ...
- Java生成1,2,2,3,3,3,4,4,4,4,5...序列
程序很简单,无须赘述. 竖向输出方式: public class Test { public static void main(String[] args) { int n=0; for(n=1;n& ...
- Nginx之https配置
14.1. 对称加密 安全隐患:钥匙除我之外,还有多个人拥有.泄露风险较大,钥匙传递的过程风险较大 14.2. 非对称加密 优缺点:私钥很安全.但是非对称算法开销很大,大批量应用于业务,会导致性能成本 ...
- 分布式处理框架Hadoop的安装与使用
Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序. 充分利用集群的威力进行高速运算和存储.Hadoop实现了一 ...
- mysql版本和模式查询
查找数据库的: select version() select @@sql_mode 上面是查版本号,下面是查sql-mode,改sql-model要在mysql目录下配置文件 my.ini, 改修改 ...
- 小程序开发-iView Weapp微信小程序UI组件库入门使用
iView Weapp UI组件库 今天来试试iView Weapp 这个微信小程序组件库,看看好不好用~~ 官网地址: http://inmap.talkingdata.com/wx/index_p ...
- [LeetCode] 139. 单词拆分(DP)
题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没 ...
- elasticsearch 索引清理脚本及常用命令
elastic索引日志清理不及时,很容易产生磁盘紧张,官网给出curl -k -XDELETE可以清理不需要的索引日志. 清理脚本 #!/bin/bash #Author: 648403020@qq. ...
- 【开发总结】order by 为什么没有走索引?
1. 现象 表结构如下 CREATE TABLE `ACT_HI_INST` ( `ID` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '主键', ` ...