java基础知识之JVM

Posted bsfl-study

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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出的对象之类的引用,
只要强引用还在,永远不会回收
软引用:引用但非必须的对象,内存溢出异常之前,回收
弱引用:非必须的对象,对象能生存到下一次垃圾收集发生之前。
虚引用:对生存时间无影响,在垃圾回收时得到通知。


















































以上是关于java基础知识之JVM的主要内容,如果未能解决你的问题,请参考以下文章

「JAVA」Java基础之堆栈方法区类加载器——JVM内存模型分析

JAVA应用程序开发之JVM基础

测试必备之Java知识———— Java基础

JAVA基础知识之JVM-——使用反射生成并操作对象

java基础之----jvm介绍

JAVA基础知识之JVM-——动态代理(AOP)