您的位置:首页 > 其它

JVM虚拟机分析 一 (堆的理解)

2018-02-11 15:02 204 查看

概述

嗯嗯嗯。作为沉寂已久的苏醒(LONG LONG AGO 不吹B了!).鄙人开始总结自己的JVM
理解了.话说经常在上下班的时间拿着周志明的JVM一书,看看看!回头上来实践一下
吧。不理解。。于是乎,上网看看各大博客里面的大牛如何来吹。OK,
貌似懂了。上机研究一下吧。懂了?嗯。。。不理解。。就特么像是越光宝盒那个逗比
电影里面曾志伟的桥段。靓女,我只能写个青字,其实我是真的略懂。。。没错,略懂
。其实对于JVM。我也是略懂。
好啦。言归正传。我只想叙述一个结论。那就是JVM的资料,整体看效果不太好,而且别看那
些理论性太庞大的东西。没有实践。吹牛逼JVM?这不是在背周杰伦的歌词。那OK了。
我们从实践开始理解JVM吧。嘿嘿。


特点list(拒绝长篇大论的描述。来点小标题)

- JVM中线程共享的区域
- 几乎用于存放所有的对象实例
- 在虚拟机启动时创建
- 主要GC区域
- 分为新生代,老年代


图解list



相关JVM参数

-Xms50m:设置初始化堆内存。这里设置为50M

Xmx100m:设置最大可允许堆内存,这里设置100M

一个案例

设置堆内存最大为100M的同时,申请够大的有效的,不被GC的对象。一个BYTE数组为
6*1024*1024个字节。哦了,不就是一个对象占用6MB么。我次奥。开始写代码


code

public static void main(String[] args) throws InterruptedException {
//注意是byte基本类型。如果是包装类将会超出
List<byte[]> list = new ArrayList<byte[]>();
int i = 0 ;
while(true){
Thread.sleep(20000);  //设置休眠频率以便于观察JVM
list.add(new byte[1024*1024*6]);
System.out.println(i++);
}
}


输出如下



观察VisualVm



计算解析

期望分配计算:
可用最大字节数:100*1024*1024 = 104,857,600
单个BYTE数组占用字节数: 6*1024*1024=6291456
预计可分配数:104,857,600 / 6291456 = 16次

实际分配计算:
共分配次数:14次
堆溢出时字节数:88080384 = 84M
其他对象以及JVM自身初始化占堆空间:104857600-88080384 =16M


总结

通过验证,我们发现JVM自身以及list对象包括方法执行过程中会有内存波动,影响堆
空间。6M一个对象,总共分配了14次。造成了内存溢出。通过设置-Xmx100M,限制堆
内存。
注意:一定是byte,char,int等基本类型。(当然不包括long这种在内存空间上为
DWORD的类型。),不能为包装类。如果为包装类的话,则会产生出来其他的内存空
间对象。之前的计算则不成立了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: