《JVM-十问十答》

 

《JVM-十问十答》

 

1. 内存模型以及每个区存放什么

 1) JVM分为堆区、栈区、方法区,初始化的对象放在堆里面,引用放在栈里面,class类信息常量池(static常量和static变量)等放在方法区

 

 2) 方法区:主要是存储类信息,常量池(static常量和static变量),编译后的代码(字节码)等数据

 3) 堆:初始化的对象,成员变量(非static变量),所有的对象实例和数组都要在堆上分配

 

 4) 栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,

    局部变量表存放的是8大基础类型加上一个引用类型,所以还是一个指向地址的指针

 

 5) 本地方法栈:主要为Native方法服务

 

 6) 程序计数器:记录当前线程执行的行号

 

 

2. java垃圾回收机制是什么

 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。

 在JVM中有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行。

 垃圾回收线程扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

 

 

3. Minor GC与Full GC分别在什么时候发生?

 新生代内存不够用时候发生Minor GC,JVM内存不够的时候发生Full GC

 

 

4. System.gc() 和Runtime.gc() 作用?

 这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM。

 

 

5. 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

 不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

 

 

6. 垃圾回收算法有哪些?

 详见《JVM-概述-内存区域-回收算法-收集器》介绍

 

 

7. Java 类加载过程?

 1) 加载

  加载是类加载的第一个过程,在这个阶段,完成三件事情:

  a. 通过一个类的全限定名获取该类的二进制流。

  b. 将该二进制流中的静态存储结构转化为方法去运行时数据结构。

  c. 在内存中生成该类的Class 对象,作为该类的数据访问入口。

 

 2) 验证

  验证的目的是为了确保Class文件的字节流中的信息不会危害到虚拟机,在该阶段完成四种验证:

  a. 文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型。

  b. 元数据验证: 对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。

  c. 字节码验证:通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。

  d. 符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。

 

 3) 准备

  准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。

  准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。

  public static int value=666; //在准备阶段value初始值为0。在初始化阶段才会变为666。

 

 4) 解析

  该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。

 

 5) 初始化

  初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。

  到了初始化阶段,才真正开始执行类中定义的Java程序代码。

  

 6) 使用

 

 7) 卸载

 

 

8. 什么是类加载器,类加载器有哪些?

 Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。

 简单来说是加载.class文件到jvm内存。

 

 类加载机制(加载过程中会先检查类是否被已加载,检查顺序是自底向上; 加载的顺序是自顶向下)

 1) 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。比如: jre\lib\rt.jar

 

 2) 扩展类加载器(Extension ClassLoader):它用来加载Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。比如: JRE\lib\ext\*.jar

 

 3) 系统类加载器(Application ClassLoader):它根据Java应用的类路径( CLASSPATH指定路径的jar )来加载Java 类。

    一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。 

       

 4) 用户自定义类加载器(Custom ClassLoader),通过继承java.lang.ClassLoader类的方式实现,Classload的子类自定义加载class。

 

 

9. 什么是类加载器双亲委派模型机制?

 当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

 

 

10. 常用的内存调试工具?

 jmap 查看内存

 jhat 进行dump堆的信息

 jstack 可以看当前栈的情况

 Jconsole(Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具。包括:jvm概述、内存、线程、类、VM概要、MBean。

 JProfiler 由ej-technologies GmbH公司开发的一款性能瓶颈分析工具。

 

822a9f8b8955e078274dca6ebc3e185b151.jpg

 

 

转载于:https://my.oschina.net/devpmp/blog/3079255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值