- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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?则是随机分配内存,不定长度,存在内存分配
您可能关注的文档
最近下载
- 部编版六年级语文上册一二单元测试卷.doc VIP
- 2024年9月江苏省税务系统遴选面试真题带详解.docx VIP
- 20192020学年人教部编版六年级语文上册第一二单元测试卷.doc VIP
- 【人教部编版】小学语文六年级上册单元测试卷汇编一.pdf VIP
- 部编版六年级上册第一单元测试卷 人教(部编版).doc VIP
- 湖南省衡阳市名校联考联合体2024届高三高考考前仿真联考一数学试题含答案.docx VIP
- 年产6万吨合成蜡深加工项目(红石化工公司)环境影响报告.docx
- 2025年护理人员N1进阶N2考试试题及答案 .pdf VIP
- DB21T1342-2021 建筑工程文件编制归档规程.pdf
- Unit-1-Discovering-Useful-Structures-超好用的公开课获奖课件-(.pptx VIP
文档评论(0)