• 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

    在这里插入图片描述

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

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

    这是创建作者标题模板

    在这里插入图片描述

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

    在这里插入图片描述

    问题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常量池放入 运行时常量池,将字面引用和符号引用转化为直接引用。然后将方法指令存入方法区当中。运行时常量池里的引用对象就是字节码对象。**

  • 相关阅读:
    RabbitMQ简介&在分布式微服务中的使用场景
    Android Studio的笔记--随机数
    设计模式之享元模式
    windows使用nginx探索笔记
    【Apollo学习笔记】——规划模块TASK之RULE_BASED_STOP_DECIDER
    信号的概念
    QT静态链接库
    实时WebRTC网页播放器进入快速功能迭代
    如何便捷获取参考文献的引用格式?
    05_css选择器的使用
  • 原文地址:https://blog.csdn.net/qq_53374893/article/details/132816818