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:设置初始化堆内存。这里设置为50MXmx100m:设置最大可允许堆内存,这里设置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的类型。),不能为包装类。如果为包装类的话,则会产生出来其他的内存空 间对象。之前的计算则不成立了。
相关文章推荐
- 深入理解JVM虚拟机 性能分析实战
- 深入理解JVM虚拟机学习笔记(三)内存分配和回收策略
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结——第二章 Java内存区域与内存溢出异常
- 读书笔记-深入理解JVM虚拟机-1.OOM初探
- 深入理解JVM虚拟机学习笔记(四)虚拟机性能监控和故障处理工具
- [深入理解JVM 六]---虚拟机字节码执行系统
- 【深入理解Java虚拟机JVM】java如何实现跨平台
- 深入理解JVM虚拟机总结
- 深入理解JVM—JVM内存模型(很经典) (部分摘自 深入JAVA虚拟机 周志明著)
- Jcmd 分析jvm虚拟机并解析jfr文件
- 深入理解JVM虚拟机 内存区域
- 深入理解JVM虚拟机 线程安全与锁优化
- 读书笔记-深入理解JVM虚拟机-1.OOM初探
- 深入理解JVM-虚拟机加载机制-类加载过程
- 深入理解Java虚拟机笔记--JVM内存模型及溢出问题总结
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结—— 第十三章 线程安全与锁优化
- 理解JVM(3)虚拟机参数
- Java内存回收知识(读书笔记)--深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)2.2~2.3
- 《深入理解 Java 虚拟机》学习笔记(1)—— JVM 运行时数据区
- 深入理解JVM虚拟机学习笔记(二)垃圾收集器与垃圾收集算法