美文网首页
JVM内存模型及分区 类加载器 引用类型 HashMap

JVM内存模型及分区 类加载器 引用类型 HashMap

作者: WaterYuan | 来源:发表于2019-05-16 11:01 被阅读0次

    JVM内存模型及分区
    线程私有3个:程序计数器(当前线程所执行的字节码的行号指示器)、Java虚拟机栈、本地方法栈
    线程共有2个:方法区(即静态区,存放已被虚拟机加载的类信息、常量、静态变量)、Java堆(存放实例对象和数组)
    区别:虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机栈使用到的Native方法服务。
    JVM基础知识总结:内存模型及分区,栈内存分配和堆内存分配及内存分配与回收

    字符串常量池在Java内存区域的哪个位置?
    在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;
    在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。
    字符串常量池中的字符串只存在一份! 如:

    String s1 = "hello,world!";
    String s2 = "hello,world!";
    System.out.println(t1 == t2);

    即执行完第一行代码后,常量池中已存在 “hello,world!”,那么 s2不会在常量池中申请新的空间,而是直接把已存在的字符串内存地址返回给s2。返回true
    Java中的常量池(字符串常量池、class常量池和运行时常量池)

    java常见面试题及答案 1-10
    java常见面试题及答案 11-20(JVM)
    Java常见面试题及答案 21-30(集合类)


    类加载器
    Java类加载器包括⼏种?它们之间的⽗⼦关系是怎么样的?双亲委派机制是什么意思?有什么好处?
    Bootstrp loader、ExtClassLoader、AppClassLoader
    父子关系如下:
    启动/引导类加载器 ,由C++ 实现,没有父类;
    扩展类加载器,由Java语言实现,父类加载器为null;
    应用类加载器,由Java语言实现,父类加载器为扩展类加载器;
    自定义类加载器,父类加载器肯定为AppClassLoader。
    双亲委派机制:类加载器收到类加载请求,自己不加载,向上委托给父类加载,父类加载不了,再自己加载。
    优势避免Java核心API篡改。

    定义自已的类加载器分为两步:
    1、继承java.lang.ClassLoader
    2、重写父类的findClass方法
    读者可能在这里有疑问,父类有那么多方法,为什么偏偏只重写findClass方法?
    因为JDK已经在loadClass方法中帮我们实现了ClassLoader搜索类的算法,当在loadClass方法中搜索不到类时,loadClass方法就会调用findClass方法来搜索类,所以我们只需重写该方法即可。如没有特殊的要求,一般不建议重写loadClass搜索类的算法。

    在 Java 的反射中,Class.forName 和 ClassLoader 的区别
    根据运行结果得出Class.forName加载类是将类进了初始化,而ClassLoader的loadClass并没有对类进行初始化,只是把类加载到了虚拟机中。
    应用场景:
    在我们熟悉的Spring框架中的IOC的实现就是使用的ClassLoader。

    而在我们使用JDBC时通常是使用Class.forName()方法来加载数据库连接驱动。这是因为在JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己。


    HashMap和Hashtable的区别:
    线程安全、速度、null
    HashMap几乎可以等价于Hashtable
    HashMap的键值(key)和值(value)可以是null,非线程安全的,但可通过如下变成synchronized
    Map<String, String> hashMap = new HashMap<>();
    Map m = Collections.synchronizedMap(hashMap);
    如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。


    Java 关于强引用,软引用,弱引用和虚引用的区别与用法
    由高到低依次为:强引用、软引用、弱引用和虚引用。
    2、软引用(SoftReference)
    如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。
    3.弱引用(WeakReference)
    弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

    Java四种引用包括强引用,软引用,弱引用,虚引用。
    应用场景:

    • 软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。
    • 弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
      弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。
    • 虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
      虚引用主要用于检测对象是否已经从内存中删除。

    相关文章

      网友评论

          本文标题:JVM内存模型及分区 类加载器 引用类型 HashMap

          本文链接:https://www.haomeiwen.com/subject/jdvbaqtx.html