java的内存管理机制

1、内存区域的分类

栈内存:基本类型变量和对象的引用,优势在于存取速度快

堆内存:new创建的对象和数组以及对象的实例化变量,优势在于动态分配内存,但是存取速度相对较慢

2、不同类型的内存分配

(1)基本数据类型:类似int,char,double之类的数据类型

当使用int a;来定义的时候,会在栈空间分配一个空间来存a(此时为空);当使用int a=2;来定义的时候,会在栈空间分配一个空间来存a,同时去找有没有值为2的内存空间,如果有就把a的地址空间指向2的地址空间,如果没有就创建值为2的地址空间,把a的地址空间指向那个地址空间。

(2)对象

对对象的内存分配主要是在栈空间存放对象的地址(对应的堆空间的地址),在堆空间存放对象

(3)String

String其实就是一个类,但是有比较特殊的地方。

String s = new String(“Hello,World!”); 和 String s = “Hello,World!”; 是不一样的:

前者和普通类是一样的,后者与基本类型类似,会先去找有没有”Hello,World!”,如果没有才会去创建一个值为”Hello,World!”的对象,然后栈空间存放这个对象的在堆中的地址(记这个栈空间的地址为X,X不是对象在堆中的地址),s在栈空间的值是X。

(4)数组

栈中存放数组在堆中的首地址,堆中分配数组。

(5)方法调用时的内存分配

实例变量和对象在堆中,局部变量在栈中(方法执行完成之后就会被回收)

3、垃圾回收机制

(1)方式

JVM自己回收或者是system.gc();请求回收。

(2)对象

1)空引用:String s = null;此时s就会被回收

2)没有引用:String s = “a”;s = “b”;那么a就变成“无主孤魂”就会被回收

3)过期:方法运行完成后,方法中的局部变量就会被回收

4)互相引用:对象A引用了对象B,B直接或者间接引用了对象A,而且A和B都不被其他对象所引用,这样也会被回收

(3)垃圾回收算法

         http://speed847.iteye.com/blog/373278

时间: 2024-10-28 11:52:04

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

Java虚拟机内存管理机制

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

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

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

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

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

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

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

java自动内存管理机制

java程序员把内存管理的工作交给虚拟机,一旦出现内存泄露或者溢出问题,如果不了解内存是怎样工作的,那么排查错误将是一件异常艰难的工作. java内存区域与内存溢出异常 java运行时数据区域划分: 线程隔离的 1.程序计数器(Program Counter Register) 当前线程执行代码的行号指示器,当线程切换并分配处理器执行时间,为了保证线程恢复到正确的执行位置,每个线程都有独立的计数器 2.虚拟机栈(VM Stack) 虚拟机栈描述的是java方法执行的内存模型:每个方式执行的同时会

【Java深入研究】3、JVM内存管理机制

转自:http://blog.csdn.net/lengyuhong/article/details/5953544 近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JVM里面还是有不少以前不知道的细节,这里稍微剖析一下.先看一看JVM的内部结构-- 如图所示,JVM主要包括两个子系统和两个组件.两个子系统分别是Class loader子系统和Execution engine(执行引擎) 子系统:两个组件分别是Runtime data area (运行时数据区域)组

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

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

java内存管理机制

JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间.释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 

java内存管理机制(一)-运行时数据区

前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了三遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from java内存管理机制(一)-运行时数据区  1. java内存管理机制-运行时数据区 2. java内存管理机制-内存分配 3. java内存管理机制-垃圾回收 正文 C++与java之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙里的人却想出来…… 与C.C++程序员时刻要关注着内存的分配与释放