`

JVM理论与实践【内存结构】

    博客分类:
  • Java
阅读更多

       学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啦!

尴尬

  • 大小: 60.8 KB
0
1
分享到:
评论

相关推荐

    JVM系列之性能调优参考手册(实践篇).pdf

    标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...

    理论与实践结合 解密JVM-day01.rar

    《理论与实践结合:解密JVM》 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行Java程序并提供跨平台的运行环境。本资料“理论与实践结合 解密JVM-day01”将带你深入理解JVM的工作原理,通过理论讲解与实际...

    理论与实践结合 解密JVM-day04.rar

    在深入探讨JVM(Java虚拟机)的理论与实践结合时,我们首先需要理解JVM在Java编程中的核心地位。JVM是Java平台的核心组成部分,它负责执行编译后的Java字节码,使得Java程序具备跨平台的能力。在这个解密JVM-day04的...

    JVM规范与深入理解

    书中的内容不仅包括理论知识,还有丰富的实践案例,帮助读者将理论与实际相结合,提升对JVM的理解。特别是对于内存模型的讲解,如堆内存、栈内存、方法区以及本地方法栈的运作机制,这些内容对于理解Java程序的运行...

    JVM内存管理、调优与监控考据

    本文将从JVM内存结构、调优策略以及监控工具等多个角度进行深入考据。 首先,JVM内存分为几个主要区域,包括堆(Heap)、方法区(Method Area)、栈(Stacks)、本地方法栈(Native Method Stack)和程序计数器...

    JVM高级特性与最佳实践

    根据提供的文件信息,本文将重点围绕“JVM高级特性与最佳实践”这一主题展开,深入探讨Java虚拟机的重要概念、高级特性和实际应用中的最佳实践。 ### 一、Java虚拟机简介 Java虚拟机(Java Virtual Machine,简称...

    JVM调优视频理论及工具

    【JVM调优视频理论及工具】主要涵盖了Java虚拟机(JVM)的优化实践与相关的分析工具。在Java开发中,JVM调优是提升应用程序性能的关键环节,尤其是在高并发、大数据处理等场景下,良好的JVM配置能显著提高系统效率。...

    JVM体系结构与GC调优

    ### JVM体系结构与GC调优 #### 一、JVM体系结构概述 Java虚拟机(JVM)是Java运行环境的基础部分,它为Java程序提供了一个独立于平台的执行环境。JVM的主要职责包括:加载Java类到内存、管理运行时数据区域、执行...

    JVM调优和故障排除手册

    标签“jvm java 虚拟机”直接明确了文档的主题范围,涵盖JVM的基础知识、Java程序的内存结构以及Java编程语言与JVM之间的关系。 在提供的部分内容中,我们看到了一个结构化的目录,这表明文档系统地覆盖了JVM相关的...

    介绍JVM和Java内存模型的两篇非常不错的资料

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作原理及其...阅读"JVM的内存机制介绍.pdf"和"JVM_工作原理.pptx"将为你提供更详细的理论和实践指导。

    jvm调优实战经验

    本文将深入探讨JVM内存结构及其与程序对象的关系,以及调优实战中的步骤和策略。 1. **多功能养鱼塘-JVM内存** JVM内存分为两个主要部分:堆内存(Heap)和非堆内存(Non-Heap)。堆内存是JVM用来存储类实例和数...

    JVM Diagnostics Guide 1.4.2

    2. **内存模型**:详细讲解JVM内存结构,如堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(PC Register)等,以及它们各自的作用和相互关系。...

    JVM原理.pdf

    JVM(Java Virtual Machine,Java虚拟机)...冯立全通过分享,将JVM原理的理论与实践相结合,为听众提供了一个全面了解JVM的机会。这对于需要深入探讨Java生态系统和提高Java开发技能的开发者来说,是非常宝贵的资源。

    inside JVM(深入JAVA虚拟机光盘内容)

    《深入JAVA虚拟机》是一本全面探讨Java虚拟机(JVM)技术的权威书籍,它涵盖了JVM的内部工作机制、性能优化以及...《深入JAVA虚拟机》这本书提供了丰富的实践案例和深入的理论解析,是每个Java开发者必备的参考资料。

    深入理解_Java_虚拟机_(JVM_高级特性与最佳实践)

    #### 二、JVM的内部结构与工作原理 ##### 2.1 JVM内存区域划分 JVM的内存区域主要包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、本地方法栈(Native Method Stack)以及程序计数器(Program Counter Register)...

    inside_jvm.rar_Inside the JVM_gettingloaded.html_inside jvm_insi

    《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作...通过提供的源代码和演示,学习者可以将理论与实践相结合,增强对JVM的理解,这对于Java开发人员来说是极其宝贵的资源。

    JVM的调优机制 初始入门

    调优方法包括使用监控工具跟踪JVM性能,识别性能瓶颈,然后调整相关参数或内存结构来优化性能。实践中,可能需要反复测试和调整以达到最佳效果。 9. JVM内存管理 JVM内存管理涵盖了内存区域划分、垃圾回收机制、...

    Inside JVM CHM

    1. **JVM结构与工作原理**: - 类加载机制:JVM如何加载类文件,包括加载、验证、准备、解析和初始化五个阶段。 - 运行时数据区:堆、栈、方法区、本地方法栈、程序计数器等区域的定义和作用。 - 字节码执行引擎...

Global site tag (gtag.js) - Google Analytics