Java内存的细分析(包括垃圾回收).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java内存的细分析(包括垃圾回收)

Java内存的详细分析(包括垃圾回收) JVMJava数据结构应用服务器配置管理? 1.JAVA?的内存概述: JVM系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。当然,从进程是操作系统资源分配的单位这个角度来看,每个主内存对应于一个进程,多个线程共享该进程的资源(主内存)。 每条线程(主要处理用户定义的运算)都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。他们从主内存中取数据, 然后计算, 再存入主内存中。 当多条线程同时对主存的同一临界资源操作时,就会有线程同步问题;一些是JVM同步机制的大致过程: (1)?获取对象监视器的锁(lock) (2)?清空工作内存数据,?从主存复制变量到当前工作内存,?即同步数据?(read and load) (3)?执行代码,改变共享变量值?(use and assign) (4)?将工作内存数据刷回主存?(store and write) (5)?释放对象监视器的锁?(unlock) 注意:?其中4,5两步是同时进行的. 这些涉及到线程同步问题,在这里就不累述了,简单了解一下。 2. 从进程和线程的角度认识堆和栈 Heap Memory(堆内存):虚拟机的堆内存保存的是对象,类变量以及实例变量,它被所有线程共享,常说的垃圾回收就是对堆内存的回收。Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。也就是上述的主内存(Java Heap Memory)。 Stack Memory?栈内存:虚拟机的每一个线程都有一个私有的栈,当一个方法被调用时,下面内容被作为一个Frame (帧)被创建并且被压入栈中:   +?局部变量:包括基本数据类型,对象的引用和返回值地址。   +?一个自己的操作栈:帧内局部变量进行运算时使用,也用于传递方法的参数和接受方法的返回值。   +?一个当前方法所在类的Runtime constant pool (常量池)的引用。   方法调用完成时,帧出栈,并销毁,无论方法是正常结束还是有未捕获的异常。 Method Area?方法区(或者代码区):?当JVM加载一个class时 ,将该类的一些信息保存到Method Area,包括Runtime constant pool?,方法数据,方法和构造器代码,域等。Runtime constant pool?则 包括类名,父类名,静态变量等。Method Area在逻辑上属于Heap(因为和堆一样是被线程共享的,属于主内存)。不过它垃圾回收与Heap可能不同,取决于JVM的实现。 当通过new Class()方式创建一个实例时,JVM在Method Area寻址到该类的基本信息,?同时进行相关实例的初始化(包括实例变量),存贮在Heap中。 3. 堆和栈的进一步认识 下面我们从JVM的内存管理原理的角度来深入认识堆(Stack)和栈(Heap),并通过这些原理认清Java中静态方法和静态属性的问题。 Stack(栈)是JVM的内存指令区。Stack管理很简单,push一定长度字节的数据或者指令,Stack指针压栈相应的字节位移;pop一定字节长度数据或者指令,Stack指针弹栈。Stack的速度很快,管理很简单,并且每次操作的数据或者指令字节长度是已知的。所以Java?基本数据类型,Java?指令代码,常量都保存在Stack中。 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。StackOverflowError:如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出此异常,这种情况一般是死递归造成的。 Heap(堆)是JVM的内存数据区。Heap?的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在Heap?中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中),在Heap?中分配一定的内存保存对象实例和对象的序列化比较类似。而对象实例在Heap?中分配好以后,需要在Stack中保存一个4字节的Heap?内存地址,用来定位该对象实例在Heap?中的位置,便于找到该对象实例。 由于Stack的内存管理是顺序分配的,而且定长,不存在内存回收问题;而Heap?则是随机分配内存,不定长度,存在内存分配

文档评论(0)

ikangdwe + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档