• 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出的对象之类的引用,
    只要强引用还在,永远不会回收
    软引用:引用但非必须的对象,内存溢出异常之前,回收
    弱引用:非必须的对象,对象能生存到下一次垃圾收集发生之前。
    虚引用:对生存时间无影响,在垃圾回收时得到通知。

  • 相关阅读:
    poj 2676 Suduku (dfs)
    poj 1562 Oil Deposits (dfs)
    poj 2907 Collecting Beepers (dfs)
    poj 1655 Balancing Act (树形dfs)
    poj 3411 Paid Roads (dfs)
    hdu 2896 病毒侵袭 (AC)
    hdu 3065 病毒侵袭持续中 (AC)
    poj 2251 Dungeon Master (bfs)
    java中debug使用
    Swing入门级小项目总结
  • 原文地址:https://www.cnblogs.com/bsfl-study/p/9205523.html
Copyright © 2020-2023  润新知