JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
------------------------------------------------以上描述不准确,且看下面---------------------------------------------
1、 Jvm内存的组成:
1) PC寄存器
每个线程都会有自己的PC寄存器,PC寄存器保存的是正在执行的字节码指令的地址。
2) Java虚拟机栈
Java虚拟机栈是线程私有的,用于存储栈帧。
3) Java堆
Java堆供各条线程共享,也是所有类实例和数组对象分配内存的区域。
为了便于堆内存的管理,Java堆内存一般被划分为三个部分:
a) Young Generation Space 新生区
新生区主要用来存储新创建的对象,内存大小会比较小,垃圾回收会比较频繁。
此区又分三个区域:一个Eden Space和两个Survivor Space(0区和1区)。网上有人对这三个区域描述的相当透彻:
当对象在堆中新创建时,存储在年轻代的Eden Space;
垃圾回收器进行垃圾回收时,扫描Eden Space和0区,如果对象仍然存活,则复制到1区,如果1区已经满了,则复制到年老区;
扫描0区时,如果对象已经经历了几次垃圾回收仍然存活,JVM认为其是一个Old对象,则将其移到年老区。
扫描完毕后,JVM将Eden Space和0区清空,然后交换0区和1区的角色(即下次垃圾回收时会扫描Eden Space和1区)。
b) Tenure Generation Space年老区
年老区用来存储那些长时间被引用的对象。该区的内存大小会比较大,垃圾回收频率会比较小。
c) Permanent Space 永久存储区
永久存储区是一个常驻内存区域,用于存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。
三个区的示意图如下:
4) 方法区
方法区是可供各条线程共享的,它存储了每一个类的结构信息,例如运行时常量池、字段和方法数据等。
5) 运行时常量池
运行时常量池是每一个类或接口的常量池的运行时表示形式,运行时常量池都分配在方法区中,在类和接口被加载到虚拟机后,对应的运行时常量池就被创建。
6) 本地方法栈
本地方法栈则是为虚拟机使用到的Native方法服务。如果Java虚拟机不支持natvie方法,并且自己也不依赖传统栈的话,可以无需支持本地方法栈。
分享到:
相关推荐
Java面试精要主要涵盖了许多核心知识点,这些都是面试中常见的问题,尤其对于想要在IT行业中深入Java领域的专业人士至关重要。以下是对这些知识点的详细解读: 一、Java基础 Java的基础知识是面试的基石,包括数据...
这份"java学习的最精要笔记"旨在为初学者提供一个快速理解Java全貌的指南,并作为一个学习大纲和编码实践的参考。 一、Java基础 1. 变量与数据类型:Java有基本数据类型(如int、char、float等)和引用数据类型(如...
《Java 2精要语言详解与编程指南》是一本深入探讨Java编程语言的书籍,旨在帮助读者全面理解和掌握Java 2平台的核心特性。本书聚焦于Java语言的关键概念、语法和最佳实践,为初学者和有经验的开发者提供了一个详尽的...
- **JVM调试**:掌握如何设置断点、单步执行、查看变量值、调用堆栈等调试技巧。 - **远程调试**:了解如何调试远程应用,这对于分布式系统开发尤为重要。 5. **测试集成** - **JUnit测试**:Eclipse内置了JUnit...
需要注意的是,`run()`方法并不会立即执行,而是等待JVM调度。线程的执行顺序依赖于操作系统和JVM的线程调度策略。 在多线程环境下,可能会出现竞态条件、死锁等问题。Java提供了synchronized关键字来实现线程同步...
Java 2精要_语言详解与编程指南涵盖了Java编程语言的核心概念、语法和最佳实践,旨在帮助开发者深入理解和熟练运用Java进行软件开发。本指南主要分为以下几个关键知识点: 1. **Java基础**:首先,Java是一种面向...
在介绍Java多线程编程精要的知识点之前,我们首先需要了解Java多线程编程的基本概念。Java提供了对多线程编程的支持,这是一种允许多个线程同时执行以提高程序效率的编程方式。多线程编程能够在支持多处理器的操作...
计算机专业复试面试习题精要通常涵盖了广泛的计算机科学与技术领域的知识,包括但不限于基础理论、编程语言、数据结构、算法、操作系统、计算机网络、数据库、软件工程等方面。在这个压缩包中,只列出了一个文件...
- **类文件格式**:JVM的字节码具有特定的结构和格式,以确保能够在所有支持JVM的平台上一致地执行。Java编译器生成的.class文件必须遵循JVM定义的类文件格式。 - **垃圾回收区**:这是JVM的一个重要特性,自动管理...
2. **性能优化**:书中还详细介绍了如何优化Eclipse的性能,比如通过调整JVM参数、合理配置工作空间等方式来提升Eclipse的响应速度和稳定性。 3. **团队协作工具**:Eclipse提供了丰富的团队协作工具,如Eclipse ...
### Java复习资料精要 #### 一、Java概述与发展历程 - **JDK 1.8**:在JDK 1.6和1.7的基础上进行了显著改进与增强,发布于2014年3月18日。该版本引入了许多重要的新特性,如Lambda表达式,极大地提高了Java的开发...
### Java学习笔记精要 #### Java概述与特性 Java是一种基于解释执行的编程语言,其源码需经过编译转化为`.class`字节码文件,随后由Java虚拟机(JVM)进行解释执行。这一特性使得Java能跨越不同操作系统平台运行,...
《Java面试指南精要》 在Java开发领域,面试是检验开发者技能和知识深度的关键环节。这份"javaInterviewGuideMaster.rar"压缩包包含了全面的Java中高级开发工程师面试准备资料,旨在帮助求职者掌握核心要点,顺利...
### 黑马毕向东笔记——Java基础知识精要 #### 一、Java概述 - **起源与发展**:Java语言起源于1991年的Sun公司,最初由James Gosling等人开发,名为Oak。Oak的设计初衷是为了控制嵌入式设备,如有线电视交换盒和...
### CoreJava基础知识精要 #### 一、面向过程与面向对象编程思维转变 在软件开发领域,编程模型的选择直接影响着程序的设计与实现。传统的面向过程编程(Procedural Programming)和现代面向对象编程(Object-...
### Java基础知识精要 #### 一、Java概述 1991年,Sun公司的James Gosling等人着手开发一种名为Oak的语言,目标是控制有线电视交换盒和个人数字助理(PDA)等设备中的微处理器。到了1994年,Oak语言被正式更名为Java...
### Java基础知识精要解析 #### 一、Java概述与环境搭建 **1. Java发展史** - **起源**: 1991年,Sun公司的James Gosling等人开始研发名为Oak的语言,初衷是用于控制嵌入式设备如电视机顶盒、个人数字助理(PDA)等...