热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

谈谈java内存中的堆、栈、方法区

栈java栈的区域很小,但是存取速度很快,所以在栈中存放的都是快速执行的任务,基本数据类型的数据和对象引用。栈指针向下移动创建新的内存

java栈的区域很小,但是存取速度很快,所以在栈中存放的都是快速执行的任务,基本数据类型的数据和对象引用。

栈指针向下移动创建新的内存,向上移动释放内存

所以,JVM只会对栈执行两种操作:1.以帧为单位的压栈和出栈  2.通过 -Xss来设置栈的大小,若大小不够用则抛出StackOverflowError异常

每个线程都包含一个栈区,每个栈中的数据都是私有的,其他栈不能访问。 栈分为3个部分: 基本数据类型变量区、执行环境上下文、操作指令区

在JVM中的一个进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素被称为栈帧,每当线程调用一个方法的时候就会向方法栈中压入一个新栈帧。
这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据


类的对象存放在堆中,因为堆最吸引人的地方就在于编译器不必知道堆里分配了多少存储空间,也不必知道存储的数据在堆中要停留多长的时间,所以在堆中保存的数据得到了更大的灵活性

堆占内存的大小通过 -Xmx 和-Xms 来调节


方法区

存放所有的类信息  静态变量  静态方法  常量和成员方法

方法区和堆一样,被所有线程共享,因为方法区中存在的是整个程序中永远唯一的元素

方法区大小由 -XX: PermSize 和 -XX :MaxPermSize 来调节 


举例说明

系统收到指令启动一个java虚拟机进程后,这个进程首先会从classpath中找到比如说Main.class文件,读取这个类文件的数据,然后把类信息存储到方法区中,这个过程就是Main这个类的加载过程

然后JVM加载到的   Simple s = new Simple() 这样一条指令,就是要建一个Simple类的实例,然后就会去方法区中找这个类的信息,结果发现没找到,这时候JVM就会加载Simple类,然后吧相关的类信息放进方法区

Simple类加载完之后,jvm就开始为这个新建的实例开始分配内存,对象实例在堆中,对象引用在栈中,局部变量也在栈中,成员方法在方法区中。


推荐阅读
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 本文深入探讨了JVM的核心机制,重点解析了堆内存与栈内存的功能与特性。JVM栈主要负责程序的执行流程,包括方法调用和数据处理;而JVM堆则专注于数据的存储管理,主要用于存放对象实例。栈内存中存储的是基本数据类型以及堆中对象的引用,确保了程序在运行时能够高效地访问和操作数据。 ... [详细]
  • Java包功能详解:初学者指南(附带教学视频解析)
    本文详细解析了Java包的功能及其对初学者的重要性,并通过教学视频进行辅助讲解。文章首先介绍了包的主要作用,包括避免类和方法的命名冲突以及便于管理和组织大量的Java类。随后,逐步引导读者了解工具包中的各个工具类,如StringUtil等,并详细说明了如何配置CLASSPATH环境变量,确保项目中能够正确引用这些类。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • Java虚拟机内存管理与优化技术深入解析
    Java虚拟机内存管理与优化技术深入解析 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 本文深入探讨了Java枚举类型的使用与实践,详细解析了枚举的基本用法及其在实际开发中的应用。首先介绍了枚举作为常量的替代方案,自JDK 1.5起,通过枚举可以更加简洁、安全地定义常量,避免了传统方式中可能出现的错误。此外,文章还探讨了枚举在实现单例模式、状态机等场景中的优势,并提供了多个实际案例,帮助开发者更好地理解和运用这一强大的语言特性。 ... [详细]
  • 提升Python多环境管理效率:深入探索多Python Pip应用策略
    提升Python多环境管理效率:深入探索多Python Pip应用策略 ... [详细]
  • c#学Java–Java基本语法1.类比JAVA .NETJVM CLRJDK  FCL2.java命名约定类名称应以大写字母开头,并成为容易理解的名词或组合。如 ... [详细]
  • 如何正确配置与使用日志组件:Log4j、SLF4J及Logback的连接与整合方法
    在当前的软件开发实践中,无论是开源项目还是日常工作中,日志框架都是不可或缺的工具之一。本文详细探讨了如何正确配置与使用Log4j、SLF4J及Logback这三个流行的日志组件,并深入解析了它们之间的连接与整合方法,旨在帮助开发者高效地管理和优化日志记录流程。 ... [详细]
  • 在启用分层编译的情况下,即时编译器(JIT)的触发条件涉及多个因素,包括方法调用频率、代码复杂度和运行时性能数据。本文将详细解析这些条件,并探讨分层编译如何优化JVM的执行效率。 ... [详细]
author-avatar
mobiledu2502885111
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有