JVM学习笔记,大量例子,保证学会解读.docx

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

什么是Java虚拟机?Java虚拟机就是就是运行java程序的一个实例,就和电脑的虚拟机一样有自己的内存空间,CUP等,一个运行时的java虚拟机实例的天职就是负责运行一个java 程序,在启动一个java程序的同时也就会诞生一个虚拟机的实例,当java程序退出,虚拟机的实例就随之消亡,比如说,如果在同一台电脑上面同时运行了3个java程序,就会得到3个java虚拟机的实例,每个java程序都运行在它自己的虚拟机中。Java虚拟机内部有2个线程,守护线程和非守护线程。守护线程通常是由java虚拟机内部使用,如执行垃圾收集任务的gc,而java的初始线程为非守护线程(main方法)。虚拟机的生命周期?当非守护线程终止后,虚拟机的实例就自动退出了,也能通过System.exit方法退出。Java虚拟机的内存模型:1.程序计数器2.Java虚拟机栈3.本地方法区4.Java堆5.方法区程序计数器是什么?程序计数器是一块很小内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等基础功能都由计数器所完成。也就是说程序计数器就是负责程序执行字节码指令的。什么是Java虚拟机栈??java虚拟机栈也是线程私有的内存空间,它和java线程在同一时间创建,它保存方法的局部变量、部分结果,并参与方法的调用和返回。每一个方法被调用直至完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。java虚拟机规范中,定义了两种异常与栈空间相关:StackOverflowError及OutOfMemoryError.使用-Xss参数来设置栈的大小,栈的大小直接决定了函数调用可以达的深度???由于栈中包括局部变量表,操作数栈,返回地址等信息,方法在调用时,如果方法的参数和局部变量相对较多,那么栈中的局部变量表就越大,它的栈帧就越大。栈深度者越浅。什么是栈深度?我们的很多变量都是存放在栈内存中的,栈的高度称之为栈深度,栈深度越高,深度就越深,所存放的局部变量就越多,如果栈的深度不够深,局部变量越多,就容易出现异常StackOverflowError栈溢出异常 及OutOfMemoryError(更多出现在堆内存溢出情况),如下图测试结果:如果栈深度不够出现了StackOverflowError ,这时候就需要通过设置-Xss进行设置栈的大小,栈的大小直接决定了函数调用可以达的深度。由于栈中包括局部变量表,操作数栈,返回地址等信息,方法在调用时,如果方法的参数和局部变量相对较多,那么栈中的局部变量表就越大,它的栈帧就越大。栈深度者越浅。下图测试代码多了6个局部变量,查看栈深度。测试多了变量栈的深度也随之下降了。程序设计:尽量少使用局部变量,局部变量过多会造成栈深度变浅,导致栈溢出。栈设置,并不是设置的越大越好,应该根据项目的实际情况进行设置。栈中的局部变量表就越大,它的栈帧就越大。栈深度者越浅。如何查看栈中的变量表呢??jclasslib工具可以查看class文件中每个方法所分配的最大局部变量表容量等。局部变量表是以字为单位,进行内存的划分,long和double占2个字,另外每一个虚拟机都会有一个This执行变量,占1一个字。测试:使用jclasslib工具查看:由上图看出,显示我们的栈深度为7,字节为13long占两个字节,有6个Long类型占?6*2个字+1个字(This) =13个字Java虚拟机栈GC内存测试测试程序:s查看字:为什么test1只有3个字呢???作用域不同,即在定义b的时候a的作用域已经没有意义了,那么b就可以完全重用a变量的空间。单定义到大括号作用域内,字还是存在的,只不过没有被重用。b重用是因为在运行的过程中a作用域的字被gc掉了。测试一查看GC:可以看出,我们分配了一个较大的空间,gc过后,好像并没有怎么回收。测试二查看GC可以看到,通过用a重用b的空间,gc过后,内存已经被回收了测试三被GC,内存回收掉了测试四程序查看GC没有被GC测试五:没有被gc,只是a把c的空间重用了,并没有重用b的空间测试六:已经GC,两个变量被重用测试七:方法调用过后,可以通过gc被gc掉。总结局部表里中的字,在方法没有结束之前(除非被强制设置为null或者被其他的变量复盖空间)是不能GC,但是一旦方法结束过后,那么是可以被gc掉的?Java堆内存调优什么是Java堆内存?Java堆是Java运行时内存最重要的部分,几乎所有的对象和数组都是在堆中进行分配空间。Java堆可以分为新生代和老年代两个部分,新生代用于存放刚刚产生的对象和年轻对象,如果对象经过几次minorGC,都没有被GC掉,生存时间足够长,新生代就会被移入到老年代中。新生代

文档评论(0)

22ffbqq + 关注
内容提供者

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

1亿VIP精品文档

相关文档