06JVM之底层面试宝典

目录

Java思维导图

1.谈谈你对java的理解

2.平台无关性如何实现

3.JVM如何加载class文件

4.什么是反射

5.ClassLoader

6.ClassLoader的双亲委派机制

7.loadClass和forName的区别

小结

8.Java内存模型之线程独占部分

小结

9.Java内存模型之线程共享部分

10.常见面试题

小结


Java思维导图

1.谈谈你对java的理解

平台无关性,GC,语言特性,面向对象,类库

 

 

2.平台无关性如何实现

Compile Once,Run Anywhere如何实现?

编译时,运行时。

通过javap -c来查看编译过程。

 

为什么JVM不直接将源码解析成机器码去执行呢?

 

3.JVM如何加载class文件

 

我们从Class.forName()进入源码解析一下,再进入forName0()方法中。

到这里我们可以看native接口,也就是我们第一张图中看到的Native Interface

 

4.什么是反射

写一个反射的例子

 

5.ClassLoader

类从编译到执行的过程

谈谈ClassLoader

我们重点关注ClassLoader中的loadClass方法,发现loadClass中有个参数parent,再点击parent,会发现它也是一个ClassLoader

ClassLoader种类

ExtClassLoader

AppClassLoader

自定义ClassLoader的实现

package com.interview.reflect;

import java.io.*;

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 {
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return out.toByteArray();
    }
}
package com.interview.reflect;

public class ClassLoaderCheck {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

        MyClassLoader my =new MyClassLoader("C:/Users/peixinRo/Desktop/","MyClassLoader");
        Class c = my.loadClass("Hello");
        System.out.println(c.getClassLoader());
        c.newInstance();
    }
}

 

 

6.ClassLoader的双亲委派机制

源码解析

ClassLoader进入loadClass()方法,

parent加载App ClassLoader

findBootstrapClassOrNull加载Bootstrap ClassLoader

为什么要使用双亲委派机制去加载类?

避免多份同样字节码的加载。

 

7.loadClass和forName的区别

类的加载方式

类的装载过程

代码案例

package com.interview.classLoader;

public class Robot {

    private String name;

    public void sayHi(String stringhello) {
        System.out.println(stringhello + name);
    }

    private String throwNmae(String tag) {
        return "Hello" + tag;
    }

    static {
        System.out.println("我是static");
    }

}
package com.interview.classLoader;

public class LoadDifference {
    public static void main(String[] args) throws ClassNotFoundException {
        //不会加载静态区
//        ClassLoader c = Robot.class.getClassLoader();

        //控制台打印  我是static
        Class<?> c = Class.forName("com.interview.classLoader.Robot");
    }
}

 

小结

 

8.Java内存模型之线程独占部分

内存简介

地址空间的划分

JDK8-内存模型

程序计数器

Java虚拟机栈(Stack)

代码解释局部变量表和操作数栈

执行javap -verbose可以看到如下信息。

步骤解释:store出栈,load进栈。

iconst_0压入栈中,也就是int c=0。局部变量入参是1和2。

istore_2栈中的0pop出来,存入到局部变量的第二个中。

iload_0将第0个局部变量压入栈中。

......

 

报异常代码java.lang.StackOverflowError

 

 

小结

 

9.Java内存模型之线程共享部分

10.常见面试题

1.JVM三大性能调优参数

2.Java内存模型中堆和栈的区别

3.JDK6和JDK6+中String.intern()方法的区别

代码实现

JDK1.6

JDK1.7下

JDK1.6

JDK1.7下


 

 

小结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值