Java基础方法执行内存分析

简介: Java基础方法执行内存分析

方法在执行过程当中,在JVM中的内存是如何分配的呢,内存是如何变化的?


1.方法只定义,不调用,并且在JVM中也不会给该方法分配“运行所属”的内存空间。只有在调用这个方法的时’候,才会动态的给这个方法分配所属的内存空间。


2.在JVM内存划分上有这样三大块主要的内存空间(当然除了这三块之外还有其它的内存空间):


方法区内存

堆内存

栈内存


3.关于 “栈”数据结构:


栈:stack,是一种数据结构

数据结构反应的是数据的存储形态。

常见的数据结构:

数组

队列

栈数据结构

链表

二叉树

哈希表/散列表

等等


4.方法代码片段在哪里?方法执行的时候执行过程的内存在哪里分配?


方法代码片段属于.class字节码文件中的一部分,字节码文件在类加载的时候将其放到了方法区当中。所以JVM中的三块主要的内存空间中方法区内存最先有数据。存放了代码片段。


代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】


5.方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束之后,给该方法分配的内存空间全部释放,此时发生弹栈动作。


压栈:会给方法分配内存

弹栈:释放该方法的内存空间

6.局部变量在“方法体”中声明。局部变量运行阶段内存在栈中分配。


栈的结构图:


0a2653c851af460fa595bd959398a8f1.png


JavaSE类库中自带的类,例如:String.class,Systm.class,这些类名也是标识符。

只要是类名就一定是标识符

重点:方法调用的时候,在参数传递的时候,实际上传递的变量中保存的那个“值”传过去了


public class MethodTest11{
  public static void main(String[] args){
    int a = 10;
    int b = 20;
    int reValue = sumInt(a,b);
    System.out.println("reValue = " + reValue);
  }
  public static  int sumInt(int i,int j){
    int result = i + j;
    int num = 3;
    int reValue = divide(result,num);
      return reValue;
  }
  public static int divide(int x,int y){
    int z = x / y;
    return z;
  }
}


上述代码的方法执行内存分析图:


0a2653c851af460fa595bd959398a8f1.png


public class MethodTest12{
  public static void main(String[] args){
         int i = 10;
     method(i);
     System.out.println("main -->" + i);
   }
    public static void method(int i){
     i++;//cpu计算
     System.out.println("method -->" + i);
   }
}


上述代码的方法执行内存分析图:


0a2653c851af460fa595bd959398a8f1.png



相关文章
|
23天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
24天前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
2天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
12 1
|
3天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
11 1
|
5天前
|
Java
java内存区域
1)栈内存:保存所有的对象名称 2)堆内存:保存每个对象的具体属性 3)全局数据区:保存static类型的属性 4)全局代码区:保存所有的方法定义
13 1
|
19天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
37 6
|
17天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
21天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
72 4
|
23天前
|
存储 缓存 安全
Java内存模型(JMM):深入理解并发编程的基石####
【10月更文挑战第29天】 本文作为一篇技术性文章,旨在深入探讨Java内存模型(JMM)的核心概念、工作原理及其在并发编程中的应用。我们将从JMM的基本定义出发,逐步剖析其如何通过happens-before原则、volatile关键字、synchronized关键字等机制,解决多线程环境下的数据可见性、原子性和有序性问题。不同于常规摘要的简述方式,本摘要将直接概述文章的核心内容,为读者提供一个清晰的学习路径。 ####
36 2
|
24天前
|
存储 安全 Java
什么是 Java 的内存模型?
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)规范的一部分,它定义了一套规则,用于指导Java程序中变量的访问和内存交互方式。
56 1