面试杂文

2 阅读2分钟
  1. 元空间会产生内存溢出么?在什么情况下会产生异常呢?

java在JDK8之后,采用元空间来替换了永久代的。永久代存储的是:class 信息如:类的结构、方法数据、构造函数等。老年代是堆内存的一部分,而元空间是使用本地内存来存储这些信息的。若加载过多的类信息到内存中,也会导致内存溢出的。我们是可以设置JVM的元空间的大小的 -XX:MetaSpaceSize -XX:MaxMetaSpaceSize。

  1. 说说Java堆空间以及GC

当通过java命令启动java进程时候,会为它分配内存,内存的一部分用于创建堆空间,程序中创建对象的时候,就是从堆空间中分配内存。GC是JVM内部的一个进程,回收无效对象的内存用于将来分配

3.说说JVM的主要组成部分以及其作用

JVM包含2个子系统和两个组件,两个子系统为class loader(类加载器)、Execution Engine(执行引擎); 两个组成部分:runtime data area(运行时数据区)、nativce interface(本地接口)

类加载:根据跟定的全限定类名,来加载Class文件到运行时数据区中的方法区 执行引擎:执行字节码文件中的指令 native interface :与本地库交互,是其他编程语言交互的接口 运行时数据区:就是我们常说的JVM内存

  1. 说下JVM运行时数据区?说下JVM内存模型?

java虚拟机会在执行java程序的过程中,把它所管理的内存区域划分为若干个不同的数据区域。这些数据区域都有各自的用途,以及创建和销毁时间。有些区域随着JVM进程的启动而存在,有些区域则依赖线程的启动和结束而创建销毁。

JVM的所管理的内存被划分如下:

方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码

java堆:java虚拟机中内存最大的一块,是被所有线程共享的,几乎所有对象实例都在这里分配内存

虚拟机栈:用于存储局部变量表、操作数栈、动态链接、方法出口等

本地方法栈:与虚拟机栈的作用一样,只不过虚拟机栈服务java方法,而本地方法栈是为虚拟机调用native方法服务

程序计数器:当前线程所执行的字节码的行号指示器,字节码解析器的工作就是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都是依赖这个计数器来完成。