`
bxf12315
  • 浏览: 26863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jvm内存分配(5)

    博客分类:
  • java
 
阅读更多

下面的内容全部来自网络,基本无原创。只是学习笔记而已。

3.3 -Stack

保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

A jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

B 某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称为当前帧。当前方法所属的类称为当前类。当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前的类和常量池。当jvm会在当前帧内执行帧内数据的操作。

C 当线程激活一个java方法,jvm就会在线程的java堆栈里新压入一个帧。这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据。

D 一个方法可以以两种方法结束。一种是正常返回结束。一种是通过异常抛出而异常结束(abrupt completion)。不管以那种方式返回,jvm都会将当前帧弹出堆栈然后释放掉,这样上一个方法的帧就成为当前帧了。

E  Java栈上的所有数据是私有的,其他线程都不能该线程的栈数据。

F 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

G  java堆栈和帧在内存中也不必是连续的。帧可以分布在连续的内存区,也可以不是。帧的数据结构由jvm的实现者来决定,他们可以允许用户指定java堆栈的初始大小或最大最小尺寸。

 

Stack 结构 如下图


 

3.3.1 堆栈帧( The Stack Frame)

每个java线程执行一个方法时候,会在stack里面压入一个帧(堆栈帧)

堆栈帧有三部分:局部变量区,操作数堆栈和帧数据区。局部变量区和操作数堆栈
的大小要视对应的方法而定。编译器在编译的时候就对每个方法进行了计算并放在
了类文件(class file)中了。帧数据区的大小对一种jvm实现来说是一定的。
jvm激活一个方法时,它从类信息数据得到此方法的局部变量区和操作数堆栈的
大小,并据此分配大小合适堆栈帧压入java堆栈中。

3.3.1.1 局部变量区-(本地变量区)

包括输入参数和输出参数以及方法内的变量

A 局部变量区被组织为以一个字长为单位、从0开始计数的数组

B 类型为shortbytechar的值在存入数组前要被转换成int值,而long double在数组中占据连续的两项
C
在访问局部变量中的longdouble时,只需取出连续两项的第一项的索引值即可,如某个long值在局部变量 区中占据的索引时34项,取值时,指令只需取索引为3long值即可(不明白)

 

方法参数和局部变量在局部变量区中的存储结构



 1 RunClassMethod 静态方法

2 RunInstanceMethod 非静态方法

  第一项是个reference(引用),它指定的就是对象本身的引用,也就是我们常用的this

 

 

3.3.1.2 操作数堆栈

操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。 可把操作数栈理解为存储计算时,临时数据的存储区域。

 

下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用

 

int a = 100;

int b = 98;

int c = a+b;



 从图中可以得出:操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的。

 

  • 大小: 57.9 KB
  • 大小: 77.3 KB
  • 大小: 48.3 KB
分享到:
评论

相关推荐

    JVM内存空间分配笔记

    ### JVM内存空间分配详解 #### 一、JVM内存模型概览 ...综上所述,理解JVM内存分配机制对于Java开发者来说至关重要,这不仅有助于编写高效、稳定的代码,还能在遇到性能瓶颈时快速定位问题并进行优化。

    java中jvm内存分配相关资料总结整理

    本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...

    JVM内存分配与垃圾回收详解

    JVM 内存分配与垃圾回收详解 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,它提供了一个平台独立的方式来执行 Java 字节码。JVM 内存分配与垃圾回收是 JVM 中两个非常重要的概念,本文将对 JVM 内存分配与垃圾...

    java -jvm 内存分配和jvm调优

    总结,Java JVM内存分配和调优是一项复杂的任务,需要结合实际应用的需求和性能指标来调整。通过理解JVM内存模型,选择合适的垃圾收集器和设置合理的内存参数,可以有效提升Java应用的性能和稳定性。在实践中,不断...

    JVM内存溢出问题解析

    堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,但缺点是要在运行时动态分配内存,存取速度较慢。 JVM 如何设置虚拟内存?在 JVM 中,如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候...

    03-VIP-JVM内存分配机制与垃圾回收算法1

    4. **JVM内存分配示例分析** 在提供的代码示例中,我们看到当分配给`allocation1`的大对象超过Eden区的容量时,JVM执行了Minor GC。初始时,Eden区被完全使用,而老年代未使用。当我们尝试为`allocation2`分配内存...

    JVM初始分配的内存.doc JVM初始分配的内存.doc

    - **配置文件**:在Linux环境下,可以通过修改`/usr/local/apache-tomcat-5.5.23/bin/catalina.sh`文件来配置JVM内存参数。 - **示例**:将`JAVA_OPTS`变量设置为`'-Xms512m -Xmx1024m'`,其中`-Xms512m`表示初始...

    jvm 内存分析文档

    JVM内存分配策略基于对象的生命周期,新生代采用复制算法,老年代采用标记-压缩或标记-整理算法。内存分配的策略会影响垃圾收集的效率和程序的响应速度。 ### GC(垃圾回收) 垃圾回收是JVM自动管理内存的关键特性...

    idea插件JVM内存工具JProfiler11

    1. **内存分配和泄漏检测**:JProfiler11能详细追踪对象的创建、存活和销毁过程,帮助识别内存泄漏。通过查看对象分配图表,可以发现哪些类或方法在消耗大量内存,从而定位潜在的问题。 2. **垃圾收集分析**:...

    Jvm内存分配(7)

    《Jvm内存分配(7)》这篇博文主要探讨的是Java虚拟机(JVM)中的内存管理,特别是关于内存分配的相关知识。在Java程序运行时,JVM会为不同部分的内存区域进行分配,以保证程序的正常执行。以下是对这一主题的详细...

    JVM内存参数详解以及配置调优

    在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、垃圾回收、堆和非堆内存、内存分配和限制等方面。 JVM 结构 JVM 的结构主要由六个部分组成:JVM API、JVM 内部组件、平台...

    JVM内存模型深度剖析与优化.pdf

    JVM内存优化的目的是尽可能让对象都在新生代里分配和回收,避免频繁对老年代进行垃圾回收。以下是一些JVM内存优化的技巧: 1. 设置适当的堆大小:根据实际项目情况,设置适当的堆大小可以避免频繁的垃圾回收。 2. ...

    mat(mac)---jvm内存分析工具

    总之,MAT作为一款强大的JVM内存分析工具,对于优化Java应用的内存使用,提升应用性能,尤其是对于Mac OS X平台的开发者来说,是不可或缺的利器。通过熟练掌握MAT的使用,开发者可以更有效地管理和优化应用程序的...

    java获得jvm内存大小

    通过动态地调整`-Xms`和`-Xmx`参数,可以在运行时根据实际需求优化内存分配,从而提高程序的性能和稳定性。此外,定期检查和分析`heapSize`、`heapMaxSize`和`heapFreeSize`等指标,可以帮助开发者及时发现潜在的...

    Jvm对象内存分配理解

    Jvm 对象内存分配理解 Jvm 对象内存分配是 Java 虚拟机(Jvm)中的一种机制,用于在堆中分配对象的内存空间。该机制涉及到类加载检查、内存分配、对象初始化等多个步骤。 类加载检查 在 Jvm 对象内存分配中,首先...

    23丨如何优化JVM内存分配?.html

    23丨如何优化JVM内存分配?.html

    JVM初探- 内存分配、GC原理与垃圾收集器

    首先,JVM内存分配策略主要涉及对象如何在堆内存的不同区域进行分配。对象在新生代Eden区进行分配,这是内存分配最频繁的区域。为了减少内存分配时的线程同步问题,JVM引入了本地线程分配缓冲(TLAB),允许每个线程...

    JVM内存日志

    - 调整内存分配比例,比如新生代和老年代的比例。 - 使用合适的垃圾收集器,如CMS、G1或ZGC。 - 避免创建大量短生命周期的大对象,减少Full GC的发生。 - 定期分析内存日志,及时发现和解决问题。 总结,通过...

    JVM 深入学习教程深入分析JVM教程!jvm 内存原型,优化等等

    本教程将涵盖JVM内存模型、内存分配以及优化策略。 一、JVM内存模型 1. 堆内存:堆是所有线程共享的一块内存区域,主要用于存储对象实例。Java中的动态内存分配主要在堆上进行,垃圾收集器也会对堆进行管理,进行...

Global site tag (gtag.js) - Google Analytics