JVM

JVM模型

 一,什么是JVM?

      JAVA Virtual Mainchine(java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机,是一个通过在计算机上仿真模拟计算机的功能来实现的。java虚拟机包括字节码指令集、一组寄存器、一个栈、  一个垃圾回收堆和一个存储方法域。java虚拟机屏蔽了与平台相关的东西,使java程序只需要生成在java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。JVM执行字节码时,实际上还是把字节码解释成具体平台上的机器指令。

java虚拟机是一个可以执行java字节码的虚拟机进程。java源文件被编译成能被虚拟机执行的字节码文件。java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台重写或者重新编译。java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特征。

二,JVM加载class文件的原理是什么?

    java中的类加载是由ClassLoader和它的子类来实现,ClassLoader是一个重要的运行时java组件。它负责运行时查找和装入运行时类文件的类。java中所有的类都需要由类加载器装入到jvm才能运行,类加载器本身也是一个类,而它的工作原理是将class文件从硬盘读取到内存里面。写程序的时候,我们不需要关心类的加载,因为它已经隐式加载了。除非我们有特殊的方法,像反射是显示加载。

  类加载方式有两种,

   1,隐式加载,程序在运行过程中碰到new()等方式来生成对象时,它会隐式的调用类加载器加载对应的类到jvm中。

   2,显示加载,通过class.forname(),显示加载需要的类,隐式加载与显示加载的区别:本质是一样的。

  java的类加载是动态的,并不是一次性将所有的类都加载到内存里面,而是先将基类加载到内存里,然后运行时在加载所需要的其他类。

三,java为什么要采用双亲委派模型

    java中的类加载器

      

   双亲委派模型:某加载器准备加载类的时候,都会先尝试委托其父类加载该类。只有当父类加载器无法完成加载任务时,才会尝试执行加载任务,。采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。

 

三,java 内存模型:

 

   

四,java垃圾回收

     1、java内存结构:

     

 2、Garbage Collector

         

 3、如何确定为垃圾?

  引用计数(不采用)内存开销大,引用环

从垃圾回收的根是否可见

 4、java中垃圾回收的根节点:

       局部变量

      静态变量

   Native方法所引用的对象

   活动线程,等待进程中的Moniter(wait,notify,sychnoized)

 5、朴素算法-Mark and  Sweep

    回收后,碎片化严重,

    朴素算法-Compter

    朴素算法-copy

    缺点:内存开区小,用完不可能在借一块内存

 6、分代垃圾回收算法:

 将所有的朴素算法结合起来,基础假设:一般对象在内存的暂留时间很短用完就直接回收存放在新生代,除了那些缓存起来的一般放在老生代中,

                                                将内存分为: 新生代 ,老生代

                                                新生代分为:Eden ,survivor1,survivor2,Eden中存放的是短暂对象,一般用完后就直接回收,回收不了的,就躲过了一次回收,叫survivor1,在survivor1中,回收之后不能被回收的放在survivor2中

新生代的GC 叫 MinorGC

GC算法  Eden+survivor1->survivor2中,Eden和survivor1被清理,Eden+survivor2->survivor1中Eden+survivor2被清理,在新生代中,存活一定次数会被转入老生代

Major/FullGC对老生代做gc,老生代采取Compat算法

7、虚拟机参数配置:

 -XX:NewRatio  老生代比新生代,默认值是2

-XXSurvivorRatio Eden/Survivor比例,默认是8

-XX:MaxTenuringThreshold 新生代转至老生代阈值,默认15

8、持久代:Pernatment Generation

   放置ClassLoader读进来的Class,除系统Class

  放置String.intern后的结果   abc.intern获得的是abc缓存起来的对象

  易出现OuterOfMemoryError:PermGen Space解决以上两个原因 

  解决:-XX:MaxPermSize 调整大小

9、 Metaspace vs PermSpace

     1.8以后,使用MetaSpace取消PermSpace

      String.intern结果被放入堆

      Metaspace默认不设置限制,由系统分配

10、谈谈垃圾回收机制

   1、垃圾回收再什么时候运行?在分配内存失败,还有System.gc

  2、垃圾回收对什么对象进行回收?根据可达性分析来查找不用的对象

  3 、垃圾回收算法对内存划分成那个区域?

       分为新生代,老生代和持久代,新生代存放一般对象,一般缓存对象放在老生代中,新生代又分为Eden,survivor1,survivor2,清理方式,老生代采取campter算法,持久代里面存放ClassLoader类和String.inner等等。

 

 

 

    

 

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值