java自动内存管理机制

java程序员把内存管理的工作交给虚拟机,一旦出现内存泄露或者溢出问题,如果不了解内存是怎样工作的,那么排查错误将是一件异常艰难的工作。

java内存区域与内存溢出异常

java运行时数据区域划分:

线程隔离的

1.程序计数器(Program Counter Register)

当前线程执行代码的行号指示器,当线程切换并分配处理器执行时间,为了保证线程恢复到正确的执行位置,每个线程都有独立的计数器

2.虚拟机栈(VM Stack)

虚拟机栈描述的是java方法执行的内存模型:每个方式执行的同时会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

局部变量表存放了编译期可知的基本数据类型,Reference类型,returnAddress类型。

其中long和double占用两个slot,其他占用一个,局部变量表所需内存在编译完全确定下来, 方法运行期间不会该表局部变量表大小。

这个区域规范了两种异常状况:

虚拟机栈数超过虚拟机允许数量,抛StackOverflowError

虚拟机内存扩展无法申请足够的内存空间,抛OutOfMemoryError

3.本地方法栈(Native Method Stack)

本地方法栈与虚拟机栈作用类似,虚拟机栈为虚拟机执行java程序服务,本地方法栈为虚拟机执行本地方法服务。

本地方法栈也会抛出StackOverflowError,OutOfMemoryError异常。

线程共享的

4.堆(Heap)

java 堆是所有线程共享的一块内存区域,在Java虚拟机规范中的描述是:The heap is the runtime data area from which memory for all class instances and arrays is allocated。

但是随着jit编译器发展和逃逸分析技术的成熟,栈内分配,标量替换使得对象不一定放在堆中存放

java堆是垃圾回收的主要管理区域,所以也成为GC堆,分代收集算法把内存分为一下几个区域:

新生代

Eden 、From Survivor、To Survivor

老年代

如果堆中没有内存完成分配,并且堆也无法扩展时,抛OutOfMemoryError

5.方法区(Method Area)

Method Area是所有线程共享的区域,存储类信息,常量信息,静态变量信息,编译后代码等。

SpotHot虚拟机把GC分代收集扩展至方法区,方便像管理堆一样来管理方法区,所以有些人更愿意成它为“永久代”(Permanent Generation)

时间: 2024-08-25 15:19:50

java自动内存管理机制的相关文章

Java自动内存管理机制学习(一):Java内存区域与内存溢出异常

备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.如下图所示: 2.1.1 程序计数器 程序计数器是一块较小的内存空间,它是线程的私有内存,可以看作时当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去

十分良心!全网最详细的Java 自动内存管理机制及性能优化教程

同样的,先来个思维导图预览一下本文结构. 一图带你看完本文 一.运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造.根据<Java虚拟机规范(Java SE 7 版)>的规定,请看下图: Java 虚拟机运行时数据区 1.1 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个

JVM自动内存管理机制——Java内存区域(下)

一.虚拟机参数配置 在上一篇<Java自动内存管理机制--Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a)下面是一些简单的使用参数 其中最后一个是一个运行时参数设置的简单实例.一般-XX是系统级别的配置(日志信息,或者是配置使用什么样的垃圾回收器等等),后面跟上+表示启用.不是-XX基本上是对于应用层面的配置信息 下面是一个简单的实例:表示设置初始堆大小为5M,最大堆大小为20M,并将虚拟机的参数设置打印出来,后

JVM自动内存管理机制——Java内存区域

一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄漏和内存溢出的问题.显然,这里的不容易只是相对而言的,如果我们想要降低这种代码隐患的发生,就需要对Java虚拟机怎样使用内存有了解,这样的话就算产生错误,排查起来也会相对容易.下面我们来说一说JVM运行时数据区域 1.程序计数器(PC寄存器): 被看作是当前线程所执行的字节码的行号指示器,字节码解析

2.1 自动内存管理机制--Java内存区域与内存溢出异常

自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存包括以下几个运行时数据区域[虚拟机内存模型]: 1.程序计数器: 可以看作是当前线程所执行的字节码的行号指示器.在虚拟机中,字节码解释器工作时就是通过程序计数器的值来选择下一条需要执行的字节码指令.Java虚拟机中多线程是通过线程轮流切换并分配处理机执行时间的方式实现的,在任何一个确定的时刻,一个处

Java虚拟机内存管理机制

自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范 第2版>规定,运行时数据区包括: 1.程序计数器 一块较小的内存空间,不在Ram上,而是直接划分在CPU上的,程序员无法直接操作它.当前线程所执行的字节码的行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令.每条

JAVA之自动内存管理机制

一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JVM的体系结构.代码编译的结果是从本地机器码转变为字节码,经过类加载器加载到虚拟机后才能执行程序.JVM的体系结构主要如下图所示: JVM体系结构 运行时数据区域 在上图中我们可以清楚地看到,JVM在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域,分别是程序计数器.Java虚拟机栈

深入理解Java虚拟机—内存管理机制

前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思了.下面让我们来详细介绍下这五部分: 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁. 先让我们了解下进程和线程的区别: 进程是资源分配的最小单位,线程是程序执行的

深入理解JVM(二)自动内存管理机制

2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 2.2.1 程序计数器(Program Counter Register):每一个线程都独有一个程序计数器,并且分配了一块线程私有的小块内存,程序运行时,这个计数器会记录字节码文件运行的行数,当线程切换时,则通过这个行数继续执行下面的操作 2.2.2 虚拟机栈(Java Virtual Machine