zoukankan      html  css  js  c++  java
  • java基础知识之JVM

    JVM是运行java字节码的虚拟机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆和一个存储方法域。
    运行:
    java源文件-->编译器-->字节码文件
    字节码文件-->JVM-->机器码
    ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。
    1.8jdk使用的是Sun公司的HotSpot和BEA公司的JRockit两个精华形成的JVM

    1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序
    答:先静态、先父后子。
    先静态:父静态 > 子静态
    优先级:父类 > 子类 静态代码块 > 非静态代码块 > 构造函数
    一个类的实例化过程:
    1,父类中的static代码块,当前类的static
    2,顺序执行父类的普通代码块
    3,父类的构造函数
    4,子类普通代码块
    5,子类(当前类)的构造函数,按顺序执行。
    6,子类方法的执行,

    JVM内存分配:虚拟机栈(里面有个栈帧)、堆、方法区、程序计数器、本地方法栈
    方法栈:线程创建时产生,方法执行时生成栈帧
    本地方法栈:为native方法服务
    方法区:是各个线程共享数据的区域,包括被虚拟机加载的类信息,用final修饰的常量,String对象,static修饰的静态变量(常量池)。
    堆:java代码中所有的new操作
    非堆:JVM自用的区域,方法区,JVM内部处理、类方法,构造方法等。
    程序计数器:一块很小的内存空间,代表当前线程执行的字节码的行号指示器,记录所执行的行号。程序计数器是线程私有的。
    虚拟机栈:用来描述java方法的内存模型,每个方法在执行的同时都会创建一个栈帧,栈帧存储的是方法中的局部变量,操作的数据,方法的入口返回值等信息。存储着基本数据类型和对象的引用(纸箱堆内存中对象的指针)。

    JVM垃圾回收机制:
    分代垃圾回收机制:不同的对象生命周期不同。把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。
    JVM中共划分为三个代:年轻代、年老代和持久代,
    年轻代:存放所有新生成的对象;
    年老代:在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;
    持久代:用于存放静态文件,如Java类、方法等。
    新生代的垃圾收集器命名为“minor gc”,老生代的GC命名为”Full Gc 或者Major GC”.其中用System.gc()强制执行的是Full Gc.
    判断对象是否需要回收的方法有两种:
    1.引用计数
    当某对象的引用数为0时,便可以进行垃圾收集。
    2.对象引用遍历
    果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
    触发GC(Garbage Collector)的条件:
    1)GC在优先级最低的线程中运行,一般在应用程序空闲即没有应用线程在运行时被调用。
    2)Java堆内存不足时,GC会被调用。

    jvm中一次完整的GC流程(从ygc到fgc)是怎样的,重点讲讲对象如何晋升到老年代等
    答:对象优先在新生代区中分配,若没有足够空间,Minor GC;
    大对象(需要大量连续内存空间)直接进入老年态;长期存活的对象进入老年态。如果对象在新生代出生并经过第一次MGC后仍然存活,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。

    你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms,g1:
    串行收集器:暂停所有的应用线程来工作;单线程。
    并行收集器:默认的垃圾收集器。暂停所有应用,多线程。
    G1收集器:用于大堆区域。堆内存分隔,并发回收。
    CMS收集器:多线程扫描,标记需要回收的实例,清除。

    说一说你对环境变量classpath的理解?如果一个类不在classpath下,为什么会抛出ClassNotFoundException异常,如果在不改变这个类路径的前期下,怎样才能正确加载这个类?
    classpath是javac编译器的一个环境变量。它的作用与import、package关键字有关。package的所在位置,就是设置CLASSPATH当编译器面对import packag这个语句时,它先会查找CLASSPATH所指定的目录,并检视子目录java/util是否存在,然后找出名称吻合的已编译文件(.class文件)。如果没有找到就会报错!
    动态加载包

    说一下强引用、软引用、弱引用、虚引用以及他们之间和gc的关系:
    强引用:new出的对象之类的引用,
    只要强引用还在,永远不会回收
    软引用:引用但非必须的对象,内存溢出异常之前,回收
    弱引用:非必须的对象,对象能生存到下一次垃圾收集发生之前。
    虚引用:对生存时间无影响,在垃圾回收时得到通知。

  • 相关阅读:
    String 总结
    android 调试源码
    Java 随机数总结
    Android中如何控制调节屏幕亮度
    Activity中通过Bundle传递自定义数据类型
    Android AsyncTask简单用法
    WCF 第五章 可信赖会话
    WCF 第五章 会话级别的实例
    WCF 第五章 行为 在WCF一个服务内部的事务操作
    WCF 第五章 导出并发布元数据(服务行为)
  • 原文地址:https://www.cnblogs.com/bsfl-study/p/9205523.html
Copyright © 2011-2022 走看看