zoukankan      html  css  js  c++  java
  • 类的加载与jvm内存模型

      下面的点,用来面试的时候,进行说明

      

    一:类的加载知识 

    1.平台无关性

      

    2.jvm如何架在内存文件

      

    3.classLoader

      

    4.classloader分类

      

      

    5.加载器的双亲委派机制

      可以避免加载多份字节码

      

    6.架在类的方式

      隐式加载:new

      显式加载:classLoad,forName

    7.类的装载过程

      

    8.源码

      ClassLoader类中的loadClass方法

    9.loadClass与forName的区别

      forName:已经完成了初始化

      loadClass:得到的class 是还没有完成链接的

      为什么需要?

      forName:例如使用mysql的驱动

      loadClass:例如spring的延迟架在,主要为了初始化加载的速度

    10.自定义classLoad

      使用的主要有两个函数

      findClass:将class文件加载为流文件

      defineClass:将流转为class

    package com.interview.javabasic.reflect;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    public class MyClassLoader extends ClassLoader {
        private String path;
        private String classLoaderName;
    
        public MyClassLoader(String path, String classLoaderName) {
            this.path = path;
            this.classLoaderName = classLoaderName;
        }
    
        //用于寻找类文件
        @Override
        public Class findClass(String name) {
            byte[] b = loadClassData(name);
            return defineClass(name, b, 0, b.length);
        }
    
        //用于加载类文件
        private byte[] loadClassData(String name) {
            name = path + name + ".class";
            InputStream in = null;
            ByteArrayOutputStream out = null;
            try {
                in = new FileInputStream(new File(name));
                out = new ByteArrayOutputStream();
                int i = 0;
                while ((i = in.read()) != -1) {
                    out.write(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return out.toByteArray();
        }
    }
    

      测试:

    package com.interview.javabasic.reflect;
    
    public class ClassLoaderChecker {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader");
            Class c = m.loadClass("Wali");
            System.out.println(c.getClassLoader());
            System.out.println(c.getClassLoader().getParent());
            System.out.println(c.getClassLoader().getParent().getParent());
            System.out.println(c.getClassLoader().getParent().getParent().getParent());
            c.newInstance();
        }
    }
    

      

    11.总结

      类的加载

      

    二:内存模型

    1.从线程维度进行了解

      

    2.程序计数器

      

    3.虚拟机栈

      

      

    4.递归容易引起StackOverFlowError

      递归过深,栈帧数超过虚拟机栈深度

    5.栈不需要回收

       方法调用结束后,栈帧会自动释放

      

    6.本地方法栈

      与虚拟机很相似,标注是的native方法

    7.元空间与永久代的区别

      元空间使用的是本地内存

      永久代使用的是jvm的内存

      元空间比永久代的优势如下:

      

    8.堆

      

    三:一些面试点

    1.调优参数

      

      其中,Xss影响并发线程数的大小

      

    2.堆栈的区别

      

    3.intern方法在不同jdk中的区别

      

    4.举例说明

      

      1.6:

        false:一个在堆中,一个在常量池中,所以false,以前是可以将堆的副本放到常量池中

        false

      

      1.8:

        false

        true

  • 相关阅读:
    JAVA类与对象(一)----基础概念理解
    JAVA数组
    JAVA算术运算符、关系运算符和位运算符
    JAVA数据类型
    JAVA配置环境变量
    C#中怎么生成36位的GUID
    jqAjax
    二进制1的个数
    成绩转换
    对决
  • 原文地址:https://www.cnblogs.com/juncaoit/p/13380642.html
Copyright © 2011-2022 走看看