虚拟机知识总结_第1页
虚拟机知识总结_第2页
虚拟机知识总结_第3页
虚拟机知识总结_第4页
虚拟机知识总结_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.内存区域-PC寄存器指针Java 栈Java-方法区-运行时常量池-本地方法区(C栈)1.1 PC寄存器和Java栈是与线程一一对应的,所以非线程共享,当执行一个方法时, 便在Java栈中开启一个栈帧,当前执行的栈帧一定是在Java栈的栈顶上,当前执行方法执行完毕,该栈帧便退栈;PC寄存器指针:严格来讲,是 一个数据结构,他是用来指示字节码执行到哪一行,是用来 保存当前正常执行程序的内存地址,所以没有OutOfMemoryError ;Java栈:用来存储方法的局部变量、操作栈,方法返回值信息。所以其有两种异常情况: OutOfMemoryError 和 StackOverFlowErro

2、r。何为:OutOfMemoryError 和 StackOverFlowError ?1.2 java堆和方法区与 Java进程一一对应,也就是与Java程序一一对应,所以该区域是 线程共享的;Java堆:程序启动时创建,也就是虚拟机启动时创建,用来存放对象实例及数组,是GC管理的主要区域,每一个存储在堆中的Java对象都会是这个对象的类的一个副本,它会包括继承自它父类的所有非静态属性。会抛出OutOfMemoryError异常所以,这一块的访问必然要注意同步性。方法区:用来存储已经被 JVM加载的类信息、ClassLoader的信息、常量、静态变量,HotSpot 将称为永久代(PerGe

3、n),这里主要针对常量池的回收以及类的卸载,所以也会抛出OutOfMemoryError 异常。1.3运行时常量池是方法区的一部分,用来存储编译期生成的各种字面量和符号引用、以及一些直接引用,这一部分在.java文件编译成.class文件通过ClassLoader加载到JVM时,进入方法区的运行时 常量池,由于受到方法区内存的限制,也会抛出 OutOfMemoryError异常 1.4本地方法区(C栈) 它是存储JVM运彳t Native方法准备的空间,它和Java栈功能是类似的,只不过其是运行的是本地方法,由于很对 Native方法是 C语言实现的,又称其为C栈。也会抛出 OutOfMemo

4、ryError 和 StackOverFlowError 异常1.5直接内存(NIO) (NIO同步非阻塞)并不是虚拟机运行时数据区的一部分,是JDK1.4以后引入的一种基于通道与缓冲区的IO方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在堆中的 DirectByteBuffer对象作为这块内存的应用进行操作。避免了在java堆和Native堆中来回复制数据,受本机总内存大小限制及物理寻址空间的限制。会抛出OutOfMemoryError异常.判断对象是否活动的算法-2.1引用计数算法为对象添加引用计数器,当对象其他地方引用一次时,计数器加1,当引用失效时,计数器减1,最

5、后当计数器为 0时,就是不可能在被使用的对象,但是主流的虚拟机没有有使用该计数算法判断对象是否存活,原因在于,他不能解决两个对象循环引用的问题-2.2可达性分析算法来源:只要是某个对象不再被其他活动对象所引用,那么这个对象就可以被回收了算法解析:通过一个根对象集合“GC roots”作为起始点,从这点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC roots没有被任何引用链相连时,则证明这个对象是不用了,或者说是非活动对象,则该对象就可以被GC进行回收了。-2.2.1根对象集合-a类:在方法中局部变量区的对象的引用,例如 new某一个对象时,该对象的引用的 变量就是根对集合中的一个

6、对象;-B类:在Java操作栈中的对象的引用,有些对象是在操作栈中持有的-C类:方法区中常量池的对象的的引用,以及类数据-D类:Java堆中类的class对象的引用,比如说当每个类被加载到JVM时,都会创建一个代表这个类的唯一数据类型的class对象-E类:在本地方法中持有的对象.Java中的强引用、软引用、弱引用、虚引用以及使用场景3.1 强引用(Strong Reference)就是new 一个对象类似 Object obj=new Object。,这类的引用就是强引用,GC不会回收掉该类的被引用的对象3.2 软引用(Soft Reference)指一些有用但并非必须的对象, 只有内存不足

7、时, 才会回收该类对象, 一般应用场景:实现 网页缓存、图片缓存,属于第二次才回收的对象,1.2之后,提供Soft Reference实现软引用3.3 弱引用(Weak Reference)指一些非必须的对象,只要GC工作,就一定会进行回收,使用场景:当某个对象只是偶尔的使用,并希望在引用时,时刻回收,时刻消失3.4 虚引用(Phantom Reference)一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,唯一目的,用来跟踪垃圾收集活动。.ClassLoade五作机制何i胃ClassLoader工作机制ClassLoader类加载器三个作用:-将class加载到JVM之中;-审查每

8、个类由谁加载;-将class字节码文件解析成统一要求的对象格式;类加载工作机制是一种父优先的等级加载机制,同时也成为上级委托的等级加载机制;简述:所谓等级加载,将它类比会员和接待室,具体过程是这样,任何一个会员到达任何一个会员接待室时,这个接待室首先会检查这个会员是否被自己接待过,若接待过,则拒绝本次接待,若没有接待过,那么会向上询问这个会员是否应该在上一级更高级别的接待室接待,。依次向上查询,直到有一级接待室接待或者告诉下一级这个会员不是自己接待的这个结果,则它的下一级则会接待这个会员。类加载器的类型从功能上可以分为:为接待室服务的接待室、为会员服务的接待室两种类比到Java上就是:加载JV

9、M自身工作的类的类加载器、加在用户程序类的加载器;所以大体分为三种:(1)Bootstrap ClassLoader: JVM 自身工作所需要的类 ;(2)ExtClassLoader:(与大会合作单位的员工会员)(主要加载的类是Java.ext.dirs);(3)AppClassLoader其服务目标是广大普通会员(java.class.path)可以理解上说,就是用户程 序的所有类; 综上,AppClassLoader继承 ExtClassLoader,他们都继承了 URLClassLoader类; URLClassLoader实现 了 ClassLoader 抽象类JVM加载到字节码文件

10、(class)到内存中的两种方式(1)隐式加载(2)显木加载加载class文件的步骤:加载字节码到内存 字节码验证与解析 初始化Class对象(依次执行)显示加载字节码的方式:三种this.getClass().getClassLoader().loadClass();Class.forName();通过自己定义的 ClassLoader的findClass()方法;.方法区的回收,也就是关于类加载器以及加载的类的回收-主要分为两类:常量的回收和无用类的回收.JVM的体系架构.执行判断一个对象是生存和死亡的过程-两次标记过程:-finalize()方法只会被系统调用一次.垃圾收集算法以及他们的

11、优缺点-6.1标记-清除算法-6.2复制算法-6.3标记整理算法-6.4分代收集算法.基于分代的垃圾收集算法精讲-7.1分区原理,以及分区工作过程-7.2 GC收集器的类型以及工作过程和一些重要配置参数.GC是在什么时候,对什么东西,做了什么事情 ?什么时候:能说明 minor gc/full gc的触发条件、OOM的触发条件,降低 GC的调优的策 略。比如:eden满了 minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc; gc与非gc时间耗时超过了 GCTimeRatio的限制引 发OOM,调优

12、诸如通过 NewRatio控制新生代老年代比例,通过 MaxTenuringThreshold控制 进入老年前生存次数等对什么东西:比如:从gc root开始搜索,搜索不到的对象;从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。做什么事情:比如:能说出诸如新生代做的是复制清理、from survivor to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等; 除了以上外,还能讲清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特点、优劣势,并且能说明控制 /调整收集器选择的方式。.常见的一些面试题

13、Java和C+啦内存分配和管理上有什么区别?Java与C+之间有一堵由动态内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去, 墙里面的人想出来。对于从事C和C+强序开发的开发人员来说,在内存管理领域,他们既是拥有最高权利的皇 帝,也是从事最基础工作的劳动人民-既拥有每一个对象的所有权,又担负着每一个对象从生命开始到终结的维护责任。对于Java程序员来说,虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,看起来由虚拟机 管理 内存一切都很美好。不过,也正是因为Java程序员把内存控制的权利交给Java虚拟机

14、,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会是一项异常艰难的工作。并且好的Java程序在编写的时候肯定要考虑GC的问题,怎样定义static对象,怎样new对象效率更高等等问题,简称面向GC的编程也可以说 Java的内存分配管理是一种托管的方式,托管于JVM。C+经过编译时直接编译成机器码,而 Java是编译成字节码,由JVM解释执行。C+隹编译型语言,而Java兼具编译型和解释型语言的 特点。怎么理解Java语言的平台无关性?语言无关性?通过什么方法实现的?-Java中的static变量和static方法在JVM运行中内存的分配管理有什么不同和一般变量

15、方法?静态对象非静态对象拥有属性:是类共同拥有的;是类各对象独立拥有的。内存分配: 内存空间上是固定的 ;空间在各个附属类里面分配。分配顺序:先分配静态对象的空间继而再对非静态对象分配空间,也就是初始化顺序是先静态-在heap中没有类实例的时候,类信息还存在于JVM吗?存在于什么地方?-Java类的加载过程?-java instance of关键字是如何实现的-finalize。方法什么时候被调用?析构函数(finalization)的目的是什么?垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize。方法但是在Java中很不幸,如果内存总是充足的,那

16、么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。那么finalize。究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface) 调用non-Java程序(C或C+) , finalize()的工作就是回收这部分的内存。-Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由

17、自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。 死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。-串行(serial) 收集器和吞吐量(throughput)收集器的区别是什么?吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。-8.JVM的永久代中会发生垃圾回收么?垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃

18、圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区Java垃圾回收机制总结一、垃圾回收的范围:即回收的区域Java方法栈、本地方法栈、以及 PC计数器随方法或线程的结束而自然被回收, 所以这些区域考虑要被回收的问题,Java堆和方法区是GC回收的重点区域。 因为一个接口的多个实现类需要的内存不一样, 一个方法的多个分支需要的内存 可能也不一样,二、垃圾回收的前提:需要对象已死,如何判断对象已死三、垃圾回收的方法:即垃圾回收的算法(1)标记-清除算法(2

19、)复制算法(主要对于新生代)(3)标记清理算法(4)基于分代回收的垃圾收集算法(结合标记清理算法和复制算法)四、实现:jvm垃圾收集器.新生代上的GC回收(1)Serial单线程收集器,只使用一个线程进行收集,并且收集时会暂停其他所有工作的线 程,它是client模式下的新生代收集器(2)ParNewSerial收集器的多线程版本,在单个CPU或者两个CPU的环境下,由于线程交互 的开销,无法保证性能超越 Serial收集器(3)Parallel Scavenge也是多线程收集器,与 ParNew的区别,它是吞吐量优先收集器。吞吐量=!行用户代码时间/(用户代码执行时间+垃圾回U时间)。另一点

20、区别是配置-XX:+UseAdaptiveSizePolic玩,虚拟机会自动调整 Eden/Survivor等参数来 提供用户所需的吞吐量。我们需要配置的就是内存大小-Xmx和吞吐量 GCTimeRatio.老年代上的GC回收(1)Serial old :Serial收集器的老年代版本(2)Parallel Old:Parallel Scaveng的老年代版本。此前,若新生代采用PS GC勺话,老年代只有Serial Old与之配合;而现在,有了 Parallel Old与之配合,可以在注重吞吐量及 CPU资源的敏感的场 合使用了。(3)CMS :采用的是标记清除而非标记-整理,是一款并发低停

21、顿的收集器,但是 由于标记W青除,所以内部存在碎片问题不可避免。可以使用-XX:CMSFullGCsBeforeCompaction设置执行几次CMS回收后,跟着来一次内存碎片整理。五、触发:何时开始GC注意:YoungK占整个堆的1/4;而young区中的Survivor占整个YoungK的1/8;Minor GC(新生代回收)的触发条件比较简单,Eden空间不足开始进行 Minor GC 回收新生代(此时Minor GC回收完之后,将Eden区仍然存活的对象复制到其中 的一个Sorivor区,同时将另外一个Survivor区仍然存活的又t象也复制到 Survivor 区,自始至终要保持一个 Survivo促空的)。而Full GC(老年代回收,一般伴随 一次Minor GC)则有几种触发条件:(1)老年代空间不足(2)PermSpace空间不足(3)统计得到的Minor GC晋升到老年代的平均大小大于老年代的剩余空间这里注意一点: PermSpace并不等同于方法区,只不过是 Hotspot JVM用 PermSpace来实现方法区而已,有些虚拟机没有PermSpace而用其他机制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论