Java 内存分配分析和总结.docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Java 内存分配

1.简介

现摘录一段Java5内存管理白皮书中的一段话:OnestrengthoftheJava ? 2Platform,StandardEdition(J2SE

?)isthatitperformsautomaticmemorymanagement,therebyshieldingthedeveloperfromthecomplexityofexplicitmemorymanagement.

由上面我们可以知道,Java平台采用了自动的内存管理方式,那么

JVM是如何进行内存管理的呢?

Java的内存管理实际上包含两个方面:

1).Java内存分配

2).Java的内存回收

搞清楚了这两个问题,Java的内存管理就清楚了。写这篇文章之前,问了自己一个问题:

Java采用了自动的内存管理方式,程序员实际上不用关心内存管理的细节,那为什么我们仍然需要了解Java内存管理的内幕?

原因有三:

了解Java内存管理的细节,有助于程序员编写出性能更好的程序。

比如,在新的线程创建时,JVM会为每个线程创建一个专属的栈

(stack),其栈是先进后出的数据结构,这种方式的特点,让程序员编程时,必须特别注意递归方法要尽量少使用,另外栈的大小也有一定的限制,如果过多的递归,容易导致stackoverflow。

了解Java内存管理的细节,一旦内存管理出现问题,有助于找到问题的根本原因所在。

了解Java内存管理的内幕,有助于优化JVM,从而使得自己的应用获得最佳的性能体验。

JVM的体系结构如下:

如下图所示,JVM的体系结构包含几个主要的子系统和内存区:类装载子系统,负责把类从文件系统中装入内存

GC子系统,垃圾收集器的主要工作室自动回收不再运行的程序引用对象所占用的内存,此外,它还可能负责那些还在使用的对象,以减少的堆碎片。

内存区,用于存储字节码,程序运行时创建的对象,传递给方法的参数,返回值,局部变量和中间计算结果。

执行引擎:

1、最简单的:一次性解释字节码。

2、快,但消耗内存的:“即时编译器”,第一次被执行的字节码会被编译成机器代码,放入缓存,以后调用可以重用。

3、自适应优化器,虚拟机开始的时候会解释字节码,但是会监视运行中程序的活动,并记录下使用最频繁的代码段。程序运行的时候,虚拟机只把使用最频繁的代码编译成本地代码,其他的代码由于使用的并不频繁,继续保留为字节码--由虚拟机继续解释他们。一般可以使java虚拟机80%~90%的时间里执行被优化过的本地代码,只需要编译10%~20%对性能优影响的代码。

4、由硬件芯片组成,他用本地方法执行java字节码,这种执行引擎实际上是内嵌在芯片里的。

Java的内存分配

在Java程序运行过程中,JVM定义了各种区域用于存储运行时数据。其中的有些数据区域在JVM启动时创建,并只在JVM退出时销毁。其它的数据区域与每个线程相关。这些数据区域,在线程创建时创建,在线程退出时销毁。

程序计数器寄存器(ThepcRegister)

JVM支持多个线程同时运行。每个JVM都有自己的程序计数器。在任何一个点,每个JVM线程执行单个方法的代码,这个方法是线程的当前方法。如果方法不是native的,程序计数器寄存器包含了当前执行的JVM指令的地址,如果方法是native的,程序计数器寄存器的值不会被定义。JVM的程序计数器寄存器的宽度足够保证可以持有一个返回地址或者native的指针。

栈与线程

JVM是基于栈的虚拟机.JVM为每个新创建的线程都分配一个栈.也就是说,对于一个Java程序来说,它的运行就是通过对栈的操作来完成的。栈以帧为单位保存线程的状态。JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作。

我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能

不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方

法,JVM就会在线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.

从Java的这种分配机制来看,堆栈又可以这样理解:栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。

栈中的方法调用

嵌套方法的出栈和入栈示意图:

上图中描述了嵌套方法时,stack的内存分配图,由上面可以知道,当嵌套方法调用时,嵌套越深,stack的内存就越晚才能释放,因此,

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档