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

概述

嗯嗯嗯。作为沉寂已久的苏醒(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的类型。),不能为包装类。如果为包装类的话,则会产生出来其他的内存空
间对象。之前的计算则不成立了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值