栈:
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
案例分析:
public class AppMain {// 运行时 jvm把类信息加入方法区 /** * @param args */ public static void main(String[] args) {// main方法放入方法区 Sample test1 = new Sample("hello"); // test1是引用 放入栈中 new Sample("hello")对象放入堆中 test1.printName(); } } class Sample { // 运行时 jvm把 类信息放入方法区 private String name; // new Sample()后, name 引用放入栈 name对象放入堆 public Sample(String name){ this.name = name; } public void printName(){ // 方法本身放入方法区 System.out.println(name); } }
执行分析:
Sample test1 = new Sample("hello"); test1.printName(); 0 知识前导: jvm每个线程都拥有一个方法调用栈,用于跟踪线程中运行的一系列方法调用过程, 栈中的每个元素成为栈帧,线程调用每个方法时会将方法栈压入一个新帧, 帧里面存放方法参数,局部变量,运算过程产生的临时数据 1 jvm去方法区寻Sample类信息 2 寻找不到,jvm使用classloader加载Sample类信息进入内存方法区 3 在堆内存中创建Sample对象,并持有方法区中Sample类的类型信息的引用 4 test1添加到执行main()方法的主线程java调用栈中,指向堆空间中的内存对象 5 执行test1.printName()时,jvm根据test1定位到堆空间的Sample实例,在根据 Sample实例在方法区持有的引用,定位到方法区Sample类型信息,获得printName() 字节码,执行此方法执行,打印出结果。
看另一个案例图,再次了解下 各个区域存放数据的位置:
相关推荐
年轻代进一步划分为Eden区和两个Survivor区(S0和S1)。 - **Eden区**:新创建的对象首先放置在这里。 - **Survivor区**:经过一次或多次垃圾回收后仍存活的对象会被转移到这里。如果Survivor区空间不足,对象会被...
2.1 **JVM规范**:JVM的内存模型由Java语言规范定义,包括堆、栈、方法区、本地方法栈和程序计数器等区域。 2.2 **Sun JVM**:Sun Microsystems(后被Oracle收购)开发的JVM是最早的JVM实现之一,它的内存模型和...
JVM规范定义了一个抽象的运行时环境,包括类装载、运行时数据区、执行引擎、本地方法接口和本地方法库。这些组件共同协作,保证Java程序的执行。 2.2 Sun JVM Sun JVM是最早的JVM实现之一,它遵循JVM规范,并...
- **堆栈分离的好处**: 堆和栈的分离使得资源管理更加清晰,有利于内存管理和性能优化。 #### 三、Java垃圾收集器 **3.1 垃圾收集简史** 垃圾收集技术的发展经历了多个阶段,包括最早的标记-清除算法,到现在常用...
Sun JVM支持广泛的硬件和操作系统平台。 **2.3 SUN JVM内存管理** - **Heap(堆)**:存放所有类实例和数组。 - **Method Area(方法区)**:存放已加载类的信息、常量、静态变量等。 - **Java Stack(Java栈)**...
年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。老年代主要保存生命周期长的对象,一般是一些老的对象。元...
方法区存储类信息,堆存放对象,每个线程有自己的Java栈和程序计数器,本地方法栈处理本地方法调用。 JVM执行指令的方式非常直接,通过内层循环取出并执行一个操作符字节,指令集设计简洁,有助于提高执行效率。...
- **栈(stack)**:存放线程的局部变量和方法调用信息。 #### JAVA垃圾收集器 ##### 3.1 垃圾收集简史 垃圾收集技术最初是在Lisp等语言中引入的,后来被广泛应用于各种高级编程语言中,包括Java。Java中的垃圾收集...
- **堆栈**:用于管理方法调用,存储局部变量和操作数栈等信息。 - **程序计数器寄存器**:记录当前线程所执行的字节码指令地址。 - **本地方法栈**:类似于标准的 Java 方法调用栈,但用于本地方法调用。 ### 6. ...
3. **数据存放在栈区**:基本类型如int、float、boolean等,它们的值直接存储在栈中,生命周期与局部变量相同,随着方法调用结束而销毁。 4. **this和super的区别**:`this`关键字在Java中代表当前对象,主要用于...
这些题目涵盖了Java编程语言、操作系统、网络协议、Java虚拟机(JVM)、并发与线程、内存管理、异常处理、分布式系统以及相关的网络和安全概念。以下是对这些知识点的详细解释: 1. **Java事件机制**:包括事件源、...
- **用途**: 数组常用于存储和操作一系列数据,例如数字列表、字符串数组等。 #### 八、Automatic Variables 自动变量 - **定义**: 自动变量通常指的是局部变量,它们在方法执行时创建,在方法退出时销毁。 - **...
以上知识点涵盖了JVM的基本概念、垃圾回收策略、Spring框架的初始化流程及事务管理、以及一些常见的数据结构和分布式服务框架的基础知识,对于准备Java高级工程师面试的开发者来说是非常重要的复习内容。
1. `hs_err_pid3184.log` - 这是一个错误日志文件,通常由Java虚拟机(JVM)在遇到异常或崩溃时生成,记录了出错时的堆栈跟踪和系统信息,对调试非常有帮助。 2. `manifest.mf` - 这是Java应用的标准元数据文件,...
4. **诊断工具**:JDK提供了一系列的诊断工具,如`jinfo`用于查看进程的配置信息,`jmap`用于获取堆内存映射,`jstack`用于打印线程堆栈跟踪,这些工具对于排查性能问题和内存泄漏等问题非常有用。 5. **性能监控...
【JAVA_STACK】是一个与Java程序运行时内存管理相关的主题,主要涉及到Java虚拟机(JVM)中的堆栈内存,特别是Java方法执行时的栈帧结构。在Java编程中,每一个线程都有自己的程序计数器、虚拟机栈、本地方法栈、堆...
- 堆栈寻址方式中,进栈操作通常是将累加器中的数据存入栈顶,同时栈顶指针减1;出栈操作则是将栈顶数据加载到累加器中,并将栈顶指针加1。 42. **运算型指令的寻址与转移性指令的寻址不同点在于前者取操作数,后...
这种特性极大地简化了软件的分发和部署流程,并降低了维护成本。 #### JVM (Java Virtual Machine) Java 虚拟机是 Java 应用程序运行的基础环境。它是一种抽象的计算机,具备自己的寄存器、堆栈和垃圾回收机制等。...
- **TraceView**:性能分析工具,用于查看方法调用堆栈。 #### 36. Java引入C语言 - **JNI**:Java Native Interface,允许Java代码调用C/C++函数。 #### 37. 链表与数组区别 - **数组**:连续内存空间存储数据。 ...
Micronaut 是一个现代的、全堆栈的 JVM 框架,特别适合于构建微服务和云原生应用。它以其低内存消耗和高性能而闻名,通过在编译时进行元数据驱动的构造,减少了运行时的反射和容器依赖。 【知识点详解】 1. **...