先看一下jvm运行时的内存结构图:
直接内存:
直接内存并不是jvm运行时数据区的一部分,所建议它不受jvm内存总大小的限制。个人理解直接内存就是物理机可用的内存空间。
程序计数器:
程序计数器是每一个线程所独有的一个很小的内存区域,并不是多线程所共享的共享区域。它可以被看成是字节码指令执行的指针,线程的分支,循环,跳转,异常处理,线程恢复等功能都要依赖这个计数器来完成。如果当前线程正在执行的是一个java方法,那么程序计数器指向这个字节码指令的地址,如果当前执行的是一个本地方法,则程序计数器的指向为空。
java虚拟机栈:
与程序计数器一样,java虚拟机栈也是线程私有的,声生命周期与线程相同。每一个方法在执行时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等。(更详细信息参考:
http://smallbug-vip.iteye.com/blog/2275469)
本地方法栈:
本地方法栈为使用到的Native方法服务。
java堆:
java堆是被所有线程所共享的一块内存区域。大致可以认为所有的对象实例及数组都要在堆上分配。但是随着JIT编译器的发展与逃逸分析技术的逐渐成熟,对象实例及数组在堆上分配也不是那么绝对了。java堆是GC处理的主要区域,可以通过-Xmx -Xms两个参数来修改堆内存的大小。
方法区:
方法区与Java堆一样,也是一个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有另一个别名,叫非堆(Non-Heap).
对于习惯在Hotspot虚拟机上做开发的开发者来说,方法区也被称之为"永久区",本质上,两者并不等价,仅仅是因为Hotspot虚拟机设计团队选择把GC分代收集扩展到方法区,或者说使用永久代来实现方法区的而已。
根据虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
运行时常量池在jdk1.6之前也是方法区中的一部分。用于存放编译期间生成的各种字面量和符号引用,但是jdk1.7之后常量池被转移到了堆上。jdk1.8之后永久代消失,类的元数据信息相关的数据被移到了一个与堆不相连的本地内存区域。(详情参考:http://www.infoq.com/cn/articles/Java-PERMGEN-Removed)
运行时常量池:
jdk1.6之前运行时常量池是方法区的一部分,jdk1.7之后被转移到了堆内存中。它用于存放编译期生成的各种字面量的符号引用,比如String就存放在此。
- 大小: 45.7 KB
- 大小: 51.1 KB
分享到:
相关推荐
### 三问JMM——有关JVM内存模型的深度解析 #### 前言 近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的...
### Java 虚拟机JVM内存模型知识点 #### 1. JVM概述 ##### 1.1 Java的特性与JVM的应用 Java语言的特性包括跨平台性、面向对象、安全性等。JVM是Java程序能够跨平台运行的关键,它负责将Java源代码转换成与平台无关...
JVM内存模型主要包括以下几个部分: 1. **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每个线程都有一个私有的程序计数器。 2. **Java虚拟机栈(Java Virtual Machine Stacks)**...
查看《深入理解Java虚拟机》后,自己简单总结的jvm相关的简单模型图。
了解JVM内存模型对于开发者来说至关重要,因为它有助于识别和解决性能问题,如内存泄漏、栈溢出和垃圾收集效率低等问题。通过优化内存分配、管理对象生命周期和理解垃圾收集机制,我们可以显著提高Java应用的效率和...
本指南将深入探讨JVM内存模型,以及如何通过调整相关参数来优化性能。 首先,我们需要理解JVM的内存结构。JVM内存主要分为以下几个区域: 1. **堆(Heap)**:这是Java对象的主要存储区域,分为年轻代(Young ...
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧
总的来说,JVM作为Java语言的核心组成部分,其历史发展、运行时数据区域的管理以及内存回收机制是理解和优化Java应用程序性能的关键。理解这些知识点,有助于开发者编写出更高效、更稳定的代码。
#### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - **直接内存**:这...
《Jvm内存分配(7)》这篇博文主要探讨的是Java虚拟机(JVM)中的内存管理,特别是关于内存分配的相关知识。在Java程序运行时,JVM会为不同部分的内存区域进行分配,以保证程序的正常执行。以下是对这一主题的详细...
* 运行时数据区:运行时数据区是 JVM 的内存模型,包括方法栈、堆、程序计数器等区域。 JVM 的内存管理机制 JVM 的内存管理机制包括内存分配和垃圾回收两个方面。 * 内存分配:JVM 会根据不同的对象分配不同的...
2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...
#### JVM内存模型 - **JVM规范**:JVM规范定义了JVM的架构和行为,包括内存布局、执行模型以及异常处理等关键方面。 - **Sun JVM**:Sun Microsystems(现已被Oracle收购)的JVM实现遵循JVM规范,提供了具体且高效...
JVM 的内存模型主要包括以下几个部分: * 方法区(Method Area):用于存储类的元数据,例如类的定义、字段、方法等信息。 * 堆(Heap):用于存储对象实例和数组的数据。 * 栈(Stack):用于存储线程的执行状态和...
6JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存 7.简单说说你了解的类加载器,可以打破双亲委派么,怎么打破 8.说说你知道的几种主要的JVM参数 9.怎么打出线程栈信息 10....
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)的一部分,用于规定程序中的各种变量(包括实例字段、静态字段和数组元素等)在多个线程共享内存中的读写行为。JMM的主要目的是确保所有线程能够看到一致...
JVM内存模型 2.1 **JVM规范**:JVM的内存模型由Java语言规范定义,包括堆、栈、方法区、本地方法栈和程序计数器等区域。 2.2 **Sun JVM**:Sun Microsystems(后被Oracle收购)开发的JVM是最早的JVM实现之一,它...
深入理解JVM,意味着掌握其内存模型、垃圾回收机制、类加载机制、性能优化技巧等。此外,熟悉《JVM Specification》和相关的开源项目(如OpenJDK)是进阶学习的宝贵资源。通过实践,如分析JavaCore和dump文件,可以...
Java内存模型(JMM)是Java虚拟机(JVM)规范的一部分,用于定义多线程环境下共享变量的访问规则和操作的可见性。本文将对Java内存模型进行知识汇总,帮助读者更好地理解和掌握相关知识点。 首先,内存模型的概念是...