JVM面试题

问题1: 类加载器存在于JVM内部还是外部?

类加载器在JVM内部

问题2:在JDK1.8中,常量池是位于堆,还是元空间里

字符串常量池在堆内存中,剩下的都在元空间里

问题3:在JDK1.8中,class常量池,与运行时常量池的区别

class常量池说是池但其实是一张表,记录了类信息。运行时常量池,当类加载的时候会通过类加载器把class常量池里的字节码文件变成字节码对象加到运行时常量池,

常量池分为两大类,一个是字符串常量池,一个是运行时常量池,在JDK1.8中字符串常量池在堆内存中,运行时常量池在元空间中。

问题4:运行时常量池里的东西

静态变量的引用,字节码对象,

问题5:元空间到底在堆里不

方法区和堆在运行时数据区。方法区已经被隔出来了,元空间是方法区的实现方式,占用本地内存,在JVM里,但是不占用JVM堆的内存

问题6:元空间所存的信息,

动态代理创建,会生成字节码对象,与普通对象,字节码对象直接存在元空间(运行时常量池)当中,而普通实例对象就按照从伊甸园一次一次GC回收,进入元空间,但是可能在新生区就被杀死了,到不了元空间,

1、class常量池

2、运行时常量池

nginx -h 帮助

问题7:后台线程

普通线程不会根据主线程的关闭而关闭,后台线程会因为主线程的关闭而被关闭

Thread对象的setDaemon(true)可将指定线程设置成后台线程

问题8:GC回收机制

这才是正解,一次Eden区GC回收,然后剩下的幸存的放入To区,使用复制回收算法(作为双缓存,起到内存整理的作用),其他的被垃圾回收走,

隔一段时间From区也会GC回收,将幸存的放入To区,如果对象经过15次轻GC(指的是Eden或者幸存区的轻GC)还存在To区,则会放入老年代, 如果幸存区满了,会把这些对象清空全部放入老年区中。

当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代。若老年代全部被引用满了,就会爆OutOfMemoryError

JVM面试题_第1张图片

这是jar包打出来以后,想要改配置文件来运行,就用这个

java -Dserver.port=8082 -Ddebug=true -jar boot-test-1.0-SNAPSHOT.jar

这是创建作者标题模板

JVM面试题_第2张图片

问题9:栈运行具体存了什么呢,java创建对象的细节?

JVM面试题_第3张图片

问题10:Class常量池与运行时常量池详细介绍

1.class常量池(Class Constant Pool):

  • 我们写的每一个Java类被编译后,就会形成一份class文件;
  • class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(SymbolicReferences);
  • 每个class文件都有一个class常量池。

什么是字面量和符号引用:

1、字面量包括:

1.文本字符串

2.八种基本类型的值

3.被声明为final的常量等;

2、符号引用包括:

1.类和方法的全限定名

2.字段的名称和描述符

3.方法的名称和描述符。

2.运行时常量池(Runtime Constant Pool):

运行时常量池存在于内存中,也就是class常量池被加载到内存之后的版本,不同之处是:

  • 它的字面量可以动态的添加(String#intern()),符号引用可以被解析为直接引用JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。
  • 而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。
  • 在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。

笼统来说:class常量池在class文件里,class文件在JVM外面,class常量池存一些用于存放编译器生成的各种字面量(Literal)和符号引用(SymbolicReferences);当类加载的时候,会把class文件里的 class常量池放入 运行时常量池,将字面引用和符号引用转化为直接引用。然后将方法指令存入方法区当中。运行时常量池里的引用对象就是字节码对象。

存放编译器生成的各种字面量(Literal)和符号引用(SymbolicReferences);当类加载的时候,会把class文件里的 class常量池放入 运行时常量池,将字面引用和符号引用转化为直接引用。然后将方法指令存入方法区当中。运行时常量池里的引用对象就是字节码对象。**

你可能感兴趣的:(JVM,jvm)