Loading

JVM内存区域常见面试题

1.介绍下Java内存区域

 

Java的内存区域
在jdk1.8之前是线程私有的:程序计数器,虚拟机栈,本地方法栈
                      线程共享的:堆,方法区
                      直接内存
在jdk1.8开始是线程私有的:程序计数器,虚拟机栈,本地方法栈
                     线程共享的:堆
                    直接内存以及里面的元空间
程序计数器:指向下一条需要执行的字节码;记录当前线程的位置便于切换和恢复
虚拟机栈:描述了Java方法执行的内存模型,创建栈帧,保存该本地方法的局部变量表,操作数栈,动态链接,出口信息
本地方法栈:描述native的方法执行,会创建栈帧,也保存了该本地方法的局部变量表,操作数栈,动态链接,出口信息
堆:1.此内存区域目的是存放对象实例,几乎所有的对象实例都在这里分配内存
       2.是垃圾收集器管理的主要区域,因此也被称为GC堆。所以Java堆还可细分为:新生代和老生代
                                                                                       新生代再细致一点可以分为Eden空间,From Survivor(),To Survior()空间,进一步的划分是为了更好的回收内存或者更快的分配内存
       在jdk 7,堆内存通常分为新生代,老生代,永生代,jdk8以后,方法区(永久代)被移除了,取而代之的是元空间,原空间使用的是直接内存。

       (什么是堆中的永久代?永久代对垃圾回收是没有显著影响的,用于存放静态文件,如Java类,方法等)    
      方法区:方法区只是概念,永久代或元空间才是实现,你也可以说方法区一直存在。
       直接内存:避免了在JAVA堆和Native堆之间来回赋值数据

2.Java对象的创建过程(五步,建议默写出来并且要知道每一步虚拟机做了什么)

(1)类加载检查

虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

(2)分配内存

虚拟机将为新生对象分配内存,分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择哪种分配方式由 Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

(3)初始化零值

内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值

(4)设置对象头

初始化零值完成之后,虚拟机要对对象进行必要的设置

(5)执行init方法

 什么是类的加载?

     将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个Java.lang.Class对象,用来封装类在方法区内的数据结构。

类加载器:启动类加载器,扩展类加载器,应用程序类加载器

 

类的生命周期

类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图;

    加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
    连接,连接又包含三块内容:验证、准备、初始化。 1)验证,文件格式、元数据、字节码、符号引用验证; 2)准备,为类的静态变量分配内存,并将其初始化为默认值; 3)解析,把类中的符号引用转换为直接引用
    初始化,为类的静态变量赋予正确的初始值
    使用,new出对象程序中使用
    卸载,执行垃圾回收

Java对象结构

       对象头:第一部分存储对象自身的运行时数据,第二部分指针类型,指向对象的类元数据类型

       实例数据:用来存储对象真正的有效信息

       对其填充:JVM要求对象初始地址必须是8字节的整数倍

      

 

 

 

 

3.对象的访问定位的两种方式(句柄和直接指针两种方式)

 句柄:java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址

 直接指针:reference存储的直接就是对象的地址,速度快,节省了一次指针定位的时间开销

 

4.JVM性能调优有什么经验吗?

  (1)设置-xms=xmx,使堆更加稳定

  (2)设置-xms的大小,太小会增加YGC,太大会减少老生代大小。

  (3)为了打印日志来排查问题开启GC日志,能帮我们快速排查定位问题

5.      Sun JDK监控和故障处理命令:jps,jstat,jmap,jstack,jinfo

jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jmap,JVM Memory Map命令用于生成heap dump文件
jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
jstack,用于生成java虚拟机当前时刻的线程快照。
jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数

 

posted @ 2022-03-17 10:06  远乡人  阅读(100)  评论(0编辑  收藏  举报