git-慕课网-剑指java面试.md

剑指JAVA面试

在Idea中看到的src和resource不是classpath, 项目被打成war包后WEB-INF中的classes,lib才是classpath,WEB-INF 是资源目录, 客户端不能直接访问,所以我们需要添加classpath访问。

六、JVM

一看你就懂,超详细java中的ClassLoader详解

java中JVM的原理

ClassLoader

git-慕课网-剑指java面试.md_第1张图片

git-慕课网-剑指java面试.md_第2张图片

git-慕课网-剑指java面试.md_第3张图片

Launcher 类

static class AppClassLoader extends URLClassLoader 
static class ExtClassLoader extends URLClassLoader

反射

git-慕课网-剑指java面试.md_第4张图片

利用反射来创建实例时,可绕过jvm的权限检查机制。

双亲委派

git-慕课网-剑指java面试.md_第5张图片

查看native代码

http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/

java.ext.dirs : C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext;C:\Windows\Sun\Java\lib\ext

sun.boot.class.path : C:\Program Files\Java\jdk1.8.0_191\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_191\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_191\jre\classes

通过指定bootclasspath,看下是否会去加载某个类

能否让extClassLoader去加载自己的类

如何让bootstrapclassloader去loadclass呢

​ “D:\zssise”

findLoadedClass

Class cl = Class.forName("java.lang.ClassLoader");
Method method = cl.getDeclaredMethod("findLoadedClass", new Class[] { String.class });
        method.setAccessible(true);
Thread.currentThread().getContextClassLoader().loadClass("sun.security.ec.CurveDB"); // 加载
method.invoke(Thread.currentThread().getContextClassLoader().getParent(),"sun.security.ec.CurveDB") // method应该传入的这个classloader是具体的classloader对象,判断sun.security.ec.CurveDB是否被加载,可以调用ex
 

git-慕课网-剑指java面试.md_第6张图片

git-慕课网-剑指java面试.md_第7张图片

因Class.loaderClass得到的class还没有链接,初始化,所以Classloader具有延时加载效果,类的初始化不需要在加载的时候就进行,加快加载时间。

而,对于mysql驱动类Driver里面有段static代码,采用Class.forName(“com.mysql.jdbc.Driver”),可以快速生成Driver对象。

git-慕课网-剑指java面试.md_第8张图片

getMethod:返回所有public的方法,包括继承和实现的父类public方法

getDeclaredMethod:获取当前类的所有属于自己声明的方法,private,public,default,protected,从父类中继承的不算,实现接口的方法由于有声明所以包括在内。

内存模型

git-慕课网-剑指java面试.md_第9张图片

程序计数器

每个线程对应一个程序计数器,所以是线程私有区域,不会发生内存泄露。

git-慕课网-剑指java面试.md_第10张图片

虚拟机栈

一个线程对应一个虚拟机栈,每个方法被执行时会创建一个栈帧。

所以,多递归会出现栈溢出(StackoverflowError);如果虚拟机栈过多会引发内存溢出(OutOfMemoryError);

虚拟机栈过多的情况:一直创建线程,且线程一直不停止,一直占用内存。则会出现虚拟机栈内存溢出。

git-慕课网-剑指java面试.md_第11张图片

git-慕课网-剑指java面试.md_第12张图片

git-慕课网-剑指java面试.md_第13张图片

你可能感兴趣的:(java)