学Java三年有余,对自己来说JVM一直以来都是黑匣子,看不懂,摸不透。作为一个有技术情节、略带些许完美主义情节的攻城狮,不了解JVM似乎有时候夜不能寐,总觉得有一个未知的世界自己需要探索。理论为实践服务,学习JVM不是因为它好玩,其实一点都不好玩,只是因为它有用罢了。实用主义者总比快餐主义让人踏实。 好吧,好奇心害死猫(Curiosity kills the cat),中秋佳节还面对电脑,真是罪过。闲话不多说了,否则显得自己很没礼貌。
学习JVM原理之前,只知道JVM的内存结构有堆、栈之分,堆中存放对象,栈中存放对象的引用。事实上,情况远比上面的一句话复杂的多,当然我仍然没忘记自己是实用主义者,因为我实在想不出有什么理由,去花费大把的时间去和JVM纠缠。
【JVM的内存结构】
简单起见,可以将JVM的内存结构划分为Java堆、虚拟机栈、方法区、本地方法栈、运行时常量池和直接内存。这样的划分不见得合理、或者逻辑清晰,只是为了学习方便而已。如下图所示:
1. Java堆:Heap
是运行时的数据区,主要用来存放Java的对象、数组内容。
2. 虚拟机栈:Virtual Machine Stacks
也可以称之为线程栈,是线程运行的内存区域,存放对象的引用(对象在堆中存放的内存地址),通过对象的引用来访问对象或者数组。
3. 方法区:Method Area
用来存放被虚拟机加载的类的相关信息(如类中的字段、方法的签名等)以及一些其他的元数据。方法区 在JVM规范中被描述为堆(Heap)的一个逻辑组成部分,但是通常称之为非堆(Non-Heap)内存,以表明其和 用来存放对象、数组的堆的不同。在Sun公司提供的HotSpot虚拟机中,方法区使用Java堆(Heap)中的永久代(Permanent Generation)来进行存放。
4. 本地方法栈:Native Method Stacks
用于运行本地方法(Native method)的内存区域,在Sun公司的HotSpot虚拟机中本地方法栈、线程栈共用一块内存区域。
5. 运行时常量池:Runtime Constant Pool
存放运行时的产生的大量常量,如字符串常量,存放在如上所述的方法区。
6. 直接内存:Direct Memory
JDK1.4中加入的NIO(非阻塞I/O)操作类、引入了基于通道(Channel)和缓冲(Buffer)的I/O方式,通过使用Native函数分配堆外内存,然后使用DirectByteBuffer对象来操作这块内存。直接内存和Java堆内存的分配没有任何交集,但是堆内存大小的设置会间接直接内存的可用空间。
【应用实例】
1. 产生Java堆溢出:通过创建大量的对象,并且保持引用来实现。
定义大对象:
class MyObject { byte[] buffer = new byte [1024 * 1024]; }
创建对象,并添加到List集合以避免被垃圾回收器回收:
List<MyObject> bufferList = new ArrayList<MyObject>(); int i = 0; while(true) { System.out.println("第" + (i++ + 1) + "次添加对象."); bufferList.add(new MyObject()); }
设置虚拟机参数:
右键Run As快捷菜单,选择“Run Configurations...”
切换到Arguments选项卡,在VM Arguments文本框输入参数
-Xms20m -Xmx20m
运行程序,抛出Java堆内存溢出异常:
java.lang.OutOfMemoryError: Java heap space
2. 线程栈溢出:通过大量的递归调用来消耗线程栈内存。
定义递归调用函数:
private int i =0; private void recursive() { System.out.println(++ i); recursive(); }
设置VM Arguments参数:
-Xss128k
运行该程序抛出栈溢出异常:
java.lang.StackOverflowError
============================
Ok,JVM内存结构学习到此结束,接下来该看看垃圾回收GC啦!
相关推荐
标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...
《理论与实践结合:解密JVM》 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行Java程序并提供跨平台的运行环境。本资料“理论与实践结合 解密JVM-day01”将带你深入理解JVM的工作原理,通过理论讲解与实际...
在深入探讨JVM(Java虚拟机)的理论与实践结合时,我们首先需要理解JVM在Java编程中的核心地位。JVM是Java平台的核心组成部分,它负责执行编译后的Java字节码,使得Java程序具备跨平台的能力。在这个解密JVM-day04的...
书中的内容不仅包括理论知识,还有丰富的实践案例,帮助读者将理论与实际相结合,提升对JVM的理解。特别是对于内存模型的讲解,如堆内存、栈内存、方法区以及本地方法栈的运作机制,这些内容对于理解Java程序的运行...
本文将从JVM内存结构、调优策略以及监控工具等多个角度进行深入考据。 首先,JVM内存分为几个主要区域,包括堆(Heap)、方法区(Method Area)、栈(Stacks)、本地方法栈(Native Method Stack)和程序计数器...
根据提供的文件信息,本文将重点围绕“JVM高级特性与最佳实践”这一主题展开,深入探讨Java虚拟机的重要概念、高级特性和实际应用中的最佳实践。 ### 一、Java虚拟机简介 Java虚拟机(Java Virtual Machine,简称...
【JVM调优视频理论及工具】主要涵盖了Java虚拟机(JVM)的优化实践与相关的分析工具。在Java开发中,JVM调优是提升应用程序性能的关键环节,尤其是在高并发、大数据处理等场景下,良好的JVM配置能显著提高系统效率。...
### JVM体系结构与GC调优 #### 一、JVM体系结构概述 Java虚拟机(JVM)是Java运行环境的基础部分,它为Java程序提供了一个独立于平台的执行环境。JVM的主要职责包括:加载Java类到内存、管理运行时数据区域、执行...
标签“jvm java 虚拟机”直接明确了文档的主题范围,涵盖JVM的基础知识、Java程序的内存结构以及Java编程语言与JVM之间的关系。 在提供的部分内容中,我们看到了一个结构化的目录,这表明文档系统地覆盖了JVM相关的...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作原理及其...阅读"JVM的内存机制介绍.pdf"和"JVM_工作原理.pptx"将为你提供更详细的理论和实践指导。
本文将深入探讨JVM内存结构及其与程序对象的关系,以及调优实战中的步骤和策略。 1. **多功能养鱼塘-JVM内存** JVM内存分为两个主要部分:堆内存(Heap)和非堆内存(Non-Heap)。堆内存是JVM用来存储类实例和数...
2. **内存模型**:详细讲解JVM内存结构,如堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(PC Register)等,以及它们各自的作用和相互关系。...
JVM(Java Virtual Machine,Java虚拟机)...冯立全通过分享,将JVM原理的理论与实践相结合,为听众提供了一个全面了解JVM的机会。这对于需要深入探讨Java生态系统和提高Java开发技能的开发者来说,是非常宝贵的资源。
《深入JAVA虚拟机》是一本全面探讨Java虚拟机(JVM)技术的权威书籍,它涵盖了JVM的内部工作机制、性能优化以及...《深入JAVA虚拟机》这本书提供了丰富的实践案例和深入的理论解析,是每个Java开发者必备的参考资料。
#### 二、JVM的内部结构与工作原理 ##### 2.1 JVM内存区域划分 JVM的内存区域主要包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、本地方法栈(Native Method Stack)以及程序计数器(Program Counter Register)...
《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作...通过提供的源代码和演示,学习者可以将理论与实践相结合,增强对JVM的理解,这对于Java开发人员来说是极其宝贵的资源。
调优方法包括使用监控工具跟踪JVM性能,识别性能瓶颈,然后调整相关参数或内存结构来优化性能。实践中,可能需要反复测试和调整以达到最佳效果。 9. JVM内存管理 JVM内存管理涵盖了内存区域划分、垃圾回收机制、...
1. **JVM结构与工作原理**: - 类加载机制:JVM如何加载类文件,包括加载、验证、准备、解析和初始化五个阶段。 - 运行时数据区:堆、栈、方法区、本地方法栈、程序计数器等区域的定义和作用。 - 字节码执行引擎...