JVM—Java内存结构

JAVA虚拟机内存

JAVA虚拟机内存,也叫JAVA内存,可以理解为Java虚拟机运行时数据区。

JVM内存结构

包括: 线程共享的方法区 和 堆, 以及每个线程私有的 JAVA栈,本地方法栈 和 PC计数器(程序计数器)。

JAVA堆

堆,是JAVA虚拟机中所管理的内存中最大的一块,此内存区域的唯一目的就是存放对象实例以及数组。

所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。

JAVA堆与垃圾回收的渊源

  JAVA堆也是垃圾回收器管理的主要区域,因此也被称为:"GC堆"。

  从内存回收的角度看,由于现在的收集器基本都采用分代收集算法,所以JAVA堆中还可以细分为:新生代和老生代。

再细致一点的划分如下:新生代又被进一步划分为Eden和 From Survivor区,最后From  Survivor由FromSpace和

ToSpace组成。

  • 新生代:新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例。
  • 旧生代:用于存放新生代中经过多次垃圾回收仍然存活的对象。

JAVA虚拟机规范对JAVA堆的规定

  JAVA堆可以处于物理上的不连续的内存空间中,只要逻辑上是连续的即可。在实现时,即可以实现成固定大小的,

也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx 和 -Xms 控制)。

关于OutOfMemoryError异常 :

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

PS:OutOfMemoryError 有时简称为 OOM异常

JAVA栈(也叫做 虚拟机栈)

  每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法

调用过程中的临时变量、参数和中间结果。

注意:JAVA栈是为JAVA方法服务的,本地方法栈是为Native方法服务的。

JAVA虚拟机规范中,对JAVA栈这个区域规定了两种异常状况:

  • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError。
  • 如果JAVA栈可以动态扩展,但是扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

与JAVA栈一样,本地方法栈区域也会抛出 StackOverflowError 和 OutOfMemoryError 异常。

PS:Native方法是指用其他语言写的方法,在JAVA中只能调用。

本地方法栈

  用于支持native方法的执行,存储了每个native方法调用的状态。

方法区

  方法区和JAVA堆一样,是各个线程共享的内存区域。

  存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(PermanetGeneration)

来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

  JAVA虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与

JAVA堆区分开来。

时间: 2024-10-23 10:17:16

JVM—Java内存结构的相关文章

java 内存结构

一.JVM是Java Virtual Machine(Java虚拟机)的缩写,不同平台上的JVM都是不同的,但向编译器提供相同的接口,编译器面向JVM生成JVM可以理解的.class字节码文件,对应平台的JVM对.class文件进行解释执行生成与该平台对应的机器码,JVM屏蔽了与具体操作系统平台相关的信息,在java跨平台实现中起到转换器的作用. 二.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. 1. 指令集 ............ 2. 寄存器 用

JVM的内存结构,JVM的回收机制

内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收.GC),这对于开发人员来说确实大大降低了编写程序的难度,但带来的一个副作用就是,当系统运行过程中出现JVM抛出的内存异常(例如OutOfMemoryError)的时候,很难知道原因是什么,另外一方面,要编写高性能的程序,通常需要借助内存来提升性能,因此如 何才能合理的使用内存以及让JVM合理的进行

Java内存结构、类的初始化、及对象构造过程

概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的读写过程:除了在执行我们写的显式的可见代码外,Jvm还会自动帮我们帮一些事,包括类的加载.初始化.GC等,这些也不特殊.以下分别来说下这些概念. Java内存结构.类的初始化.及对象构造过程

Java内存结构和数据类型

Java内存结构 内存就是暂时对数据的一个存储,他的存储速度非常的快,但是他是暂时的存储,从开机时开始存储,掉电或关机之后数据全部丢失.内存的生命周期就是开机和关机,开机的时候开始计算,关机什么都没有了.优点存储速度快,缺点容易坏掉,如果开机的时候,一点反映都没有,屏幕不亮键盘鼠标不亮,这种情况下一般都是内存条有问题.机器蓝屏,指令错误都是内存引起的. 程序的数据都是存储在内存里面,不存储在硬盘上因为硬盘不安全,可以读取数据.但是内存就不一样,内存他不允许去读取内存数据,并且速度很快所以我们的程

jvm Java内存模型

硬件的效率与一致性 在计算机中,内存的读写与处理器的计算速度有几个级的差距.这样会严重影响到TPS(Transations Per Second). 所以会为每个处理器配一个高速缓存以缓和处理器的速度.而在计算机中,多个处理器共享一个内存,这个时候数据的读写操作将不会安全 什么是内存模型                                                                        名词解释:JMM(Java Memory Model),即Java内

JVM的内存结构

Java是按照运行时数据的存储结构来划分内存结构的,java虚拟机规范将java运行时的诗句划分为6种: 1.PC寄存器 用于保存当前执行程序的内存地址,同时java程序是多线程的,不可能一直都按照线性执行下去,当有多个线程交叉执行时,被中断的线程程序当前执行到哪条的内存地址需要记录下来. 2.java栈 java栈是与线程相关到一起的,每当创建一个线程时,JVM就会为这个线程创建一个java栈,这个hava栈中含有很多的栈帧,栈帧是与每个方法关联起来的,每运行一个方法就会创建一个栈帧.每个栈帧

对Java内存结构的一点思考和实践

在一些高并发的程序,或者一些大量使用内存来进行计算的程序,有时候常常会遇到一些这样的问题:程序刚开始运行挺快的,后来就运行缓慢下来了,甚至于到了一定时间还会出现OOM或者StackOverFlow等错误.要理解这些错误产生的根源,就要了解JVM是何如划分.管理.回收内存的,本篇博客将从博主对JVM的认识以及实际经验角度出发,聊聊这些话题. JVM内存结构 一旦涉足JVM内存结构,恐怕会冒出大量的术语:新生代?老生代?永久代?等等,我们暂且抛开这些名称,基于我们的JAVA基础,它应该是什么样子的呢

JVM——Java内存区域

                                        JVM 一.概念 虚拟机:通过软件模拟的具有完整硬件功能的运行在一个完全隔离环境中的完整操作系统. JVM:软件虚拟Java字节码指令集. HoSpot是Java默认的虚拟机. 二.Java内存区域与内存溢出异常 Java虚拟机所管理的内存包括如下几个运行时数据区域: (1)线程私有区域(随线程的创建与销毁而创建与销毁):程序计数器.虚拟机栈.本地方法栈. (2)线程共有区域:Java堆.方法区.运行时常量池. 1.

day03 java内存结构以及重载

函数重载(overload)概念: 在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数 类型即可. 函数的特点: 与返回类型无关,只与参数列表有关. 数组概念: 同一种类型数据的集合,其实数组就是一个容器.格式: 元素类型[] 数组名=new 元素类型 内存结构java程序在运行时,需要在内存中的分配空间.为了提高运算效率,有队空间进行了不 同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 栈内存:用于存储局部变量,当变量使用完,所占空间自动释放. 堆内存:数