`
wx1568520008
  • 浏览: 20401 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

jvm堆栈方法区数据存放和操作流程

 
阅读更多

栈: 
 1 基础数据类型 byte short int long float double char boolean
 2 方法的形式参数,方法调用完后从栈空间回收
 3 引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC
 a) 栈内的数据线程之间独立
 b) 具体细分为:
  b.1) 基本类型变量区
  b.2) 执行环境上下文
  b.3) 操作指令区

 


 1 this
 2 new出来的对象
 3 数组
 a) jvm只有一个堆区,并被所有线程共享。

 

方法区域(又叫 静态区) 
 1 字符串常量
 2 static
 3 所有的class
 a) 被所有线程共享, 其内存放程序中永远唯一的元素,eg: static class

 

案例分析

  1. public class AppMain {// 运行时 jvm把类信息加入方法区    
  2.     
  3.     /**  
  4.      * @param args  
  5.      */    
  6.     public static void main(String[] args) {// main方法放入方法区    
  7.     
  8.         Sample test1 = new Sample("hello"); // test1是引用 放入栈中 new Sample("hello")对象放入堆中    
  9.         test1.printName();    
  10.             
  11.     }    
  12.     
  13. }    
  14.   
  15. class Sample { // 运行时 jvm把 类信息放入方法区    
  16.         
  17.     private String name; // new Sample()后, name 引用放入栈  name对象放入堆    
  18.         
  19.     public Sample(String name){    
  20.         this.name = name;    
  21.     }    
  22.         
  23.     public void printName(){ // 方法本身放入方法区    
  24.         System.out.println(name);    
  25.     }    
  26. }    


 

  1. Sample test1 = new Sample("hello");     
  2. test1.printName();    
  3. 0 知识前导:    
  4. jvm每个线程都拥有一个方法调用栈,用于跟踪线程中运行的一系列方法调用过程,    
  5.   栈中的每个元素成为栈帧,线程调用每个方法时会将方法栈压入一个新帧,    
  6.   帧里面存放方法参数,局部变量,运算过程产生的临时数据    
  7.       
  8. 1 jvm去方法区寻Sample类信息    
  9. 2 寻找不到,jvm使用classloader加载Sample类信息进入内存方法区    
  10. 3 在堆内存中创建Sample对象,并持有方法区中Sample类的类型信息的引用    
  11. 4 test1添加到执行main()方法的主线程java调用栈中,指向堆空间中的内存对象    
  12. 5 执行test1.printName()时,jvm根据test1定位到堆空间的Sample实例,在根据    
  13. Sample实例在方法区持有的引用,定位到方法区Sample类型信息,获得printName()    
  14. 字节码,执行此方法执行,打印出结果。    


 看另一个案例图,再次了解下 各个区域存放数据的位置:

转载于:https://my.oschina.net/u/2365905/blog/1823995

分享到:
评论

相关推荐

    jvm原理及调优

    年轻代进一步划分为Eden区和两个Survivor区(S0和S1)。 - **Eden区**:新创建的对象首先放置在这里。 - **Survivor区**:经过一次或多次垃圾回收后仍存活的对象会被转移到这里。如果Survivor区空间不足,对象会被...

    JVM机制原理详细讲解

    2.1 **JVM规范**:JVM的内存模型由Java语言规范定义,包括堆、栈、方法区、本地方法栈和程序计数器等区域。 2.2 **Sun JVM**:Sun Microsystems(后被Oracle收购)开发的JVM是最早的JVM实现之一,它的内存模型和...

    JVM详解及调优

    - **堆栈分离的好处**: 堆和栈的分离使得资源管理更加清晰,有利于内存管理和性能优化。 #### 三、Java垃圾收集器 **3.1 垃圾收集简史** 垃圾收集技术的发展经历了多个阶段,包括最早的标记-清除算法,到现在常用...

    JVM详解:带书签超清文字版.pdf

    Sun JVM支持广泛的硬件和操作系统平台。 **2.3 SUN JVM内存管理** - **Heap(堆)**:存放所有类实例和数组。 - **Method Area(方法区)**:存放已加载类的信息、常量、静态变量等。 - **Java Stack(Java栈)**...

    Java-JVM相关面试题(最新版)

    年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。老年代主要保存生命周期长的对象,一般是一些老的对象。元...

    Java技术与Java虚拟机

    方法区存储类信息,堆存放对象,每个线程有自己的Java栈和程序计数器,本地方法栈处理本地方法调用。 JVM执行指令的方式非常直接,通过内层循环取出并执行一个操作符字节,指令集设计简洁,有助于提高执行效率。...

    Java 新生面试题及Java中级面试题及有经验的 Java 面试问题及答案.docx

    - **堆栈**:用于管理方法调用,存储局部变量和操作数栈等信息。 - **程序计数器寄存器**:记录当前线程所执行的字节码指令地址。 - **本地方法栈**:类似于标准的 Java 方法调用栈,但用于本地方法调用。 ### 6. ...

    JAVA基础笔记.zip

    3. **数据存放在栈区**:基本类型如int、float、boolean等,它们的值直接存储在栈中,生命周期与局部变量相同,随着方法调用结束而销毁。 4. **this和super的区别**:`this`关键字在Java中代表当前对象,主要用于...

    2018阿里Java面试题70道

    这些题目涵盖了Java编程语言、操作系统、网络协议、Java虚拟机(JVM)、并发与线程、内存管理、异常处理、分布式系统以及相关的网络和安全概念。以下是对这些知识点的详细解释: 1. **Java事件机制**:包括事件源、...

    Java语言常用的方法名.doc

    - **用途**: 数组常用于存储和操作一系列数据,例如数字列表、字符串数组等。 #### 八、Automatic Variables 自动变量 - **定义**: 自动变量通常指的是局部变量,它们在方法执行时创建,在方法退出时销毁。 - **...

    2024年Java高工面试题 2024年Java高工面试题 2024年Java高工面试题

    以上知识点涵盖了JVM的基本概念、垃圾回收策略、Spring框架的初始化流程及事务管理、以及一些常见的数据结构和分布式服务框架的基础知识,对于准备Java高级工程师面试的开发者来说是非常重要的复习内容。

    JMF版的Java音乐播放器MiniMusic

    1. `hs_err_pid3184.log` - 这是一个错误日志文件,通常由Java虚拟机(JVM)在遇到异常或崩溃时生成,记录了出错时的堆栈跟踪和系统信息,对调试非常有帮助。 2. `manifest.mf` - 这是Java应用的标准元数据文件,...

    java程序开发工具集的使用共1页.pdf.zip

    4. **诊断工具**:JDK提供了一系列的诊断工具,如`jinfo`用于查看进程的配置信息,`jmap`用于获取堆内存映射,`jstack`用于打印线程堆栈跟踪,这些工具对于排查性能问题和内存泄漏等问题非常有用。 5. **性能监控...

    JAVA_STACK

    【JAVA_STACK】是一个与Java程序运行时内存管理相关的主题,主要涉及到Java虚拟机(JVM)中的堆栈内存,特别是Java方法执行时的栈帧结构。在Java编程中,每一个线程都有自己的程序计数器、虚拟机栈、本地方法栈、堆...

    计算机组成原理考试复习题

    - 堆栈寻址方式中,进栈操作通常是将累加器中的数据存入栈顶,同时栈顶指针减1;出栈操作则是将栈顶数据加载到累加器中,并将栈顶指针加1。 42. **运算型指令的寻址与转移性指令的寻址不同点在于前者取操作数,后...

    我的学习笔记,记录从零学习java的点滴

    这种特性极大地简化了软件的分发和部署流程,并降低了维护成本。 #### JVM (Java Virtual Machine) Java 虚拟机是 Java 应用程序运行的基础环境。它是一种抽象的计算机,具备自己的寄存器、堆栈和垃圾回收机制等。...

    安卓面试题

    - **TraceView**:性能分析工具,用于查看方法调用堆栈。 #### 36. Java引入C语言 - **JNI**:Java Native Interface,允许Java代码调用C/C++函数。 #### 37. 链表与数组区别 - **数组**:连续内存空间存储数据。 ...

    micronauthelloworld

    Micronaut 是一个现代的、全堆栈的 JVM 框架,特别适合于构建微服务和云原生应用。它以其低内存消耗和高性能而闻名,通过在编译时进行元数据驱动的构造,减少了运行时的反射和容器依赖。 【知识点详解】 1. **...

Global site tag (gtag.js) - Google Analytics