类加载、JVM相关问题

1.分析如下程序,并基于问题进行解答

Class<?> c1=Object.class;
Class<?> c2=Class.forName(“java.lang.Object”);
Class<?> c3=new Object().getClass();

问题?
1)Object 类被加载了几次?1次
2)c1,c2,c3指向的对象是同一个吗?
3)c2 对应的泛型"?"可以换成Object吗? 不可以

2.分析如下程序,并基于问题进行解答
class A{
static{
System.out.println(“A.static”);
}
}
问题:

  1. A 类被加载时一定会执行静态代码块?不一定
  2. static 代码块是否执行与类的加载方式有关?正确

3.说说你了解JDK中的默认类加载器,以及
采用的类加载机制?

1)类加载器:(ClassLoader)
a)AppClassLoader (自己写的类)
b)ExtClassLoader (jre/lib/ext)
c)BootStrapClassLoader(jre/lib/)
2)默认类加载机制:双亲委派模型

4.我们可以自己写类加载器吗?你是从哪里了解到
要自己写类加载器以及为什么要自己写?

可以,在使用tomcat中间件,mybatis,spring等框架
时,发现内部都使用了自定义的类加载器.

5.你了解的类加载有哪些阶段?

1)加载
2)连接
3)初始化

6.分析如下程序,回答相关问题

class A{
static int a=100;
static final int b=200;
static{}
}
class B extends A{
static{}
}
问题:
1)当我们基于B访问A类的a属性时
a)A类会被加载吗?会
b)B类会被加载吗?会
c)A的static代码块会执行吗?会
d)B的static代码块会执行吗? 不会 (因为B为被动加载)

思考:基于B访问A类的b属性时又会怎样执行?

7.分析如下程序,给出优化策略?

class A{
static int[] array=new int[1024*1024];
public static void show(){}
}

当我们访问A类的show()方法时会触发A类的加载,并且初始化
array这个数组,请问如何设计可以延迟array的初始化(这个数组
还必须使用static修饰)?

方案:将array数组的初始化放到一个静态内部类中以实现延迟
加载.

8.分析如下程序,给出相关结果

Object o1=new Object();
Object o2=new Object();
请问:
1)o1==o2; 不等于
2)o1.equals(o2);不等
3)o1.hashCode()==o2.hashCode(); 不一定

9.如何理解JAVA中的实例对象,以及其作用?
1)实例对象本质就是内存中的一块区域.
2)其作用:封装数据(pojo),处理业务(controller,service,dao)

10.如何理解对象逃逸?
对象在方法内创建,但在方法外有引用,这样的对象可以理解为
逃逸对象,而逃逸对象只能分配堆中,不能栈上分配.

11.什么样的对象可能会分配在栈上?

1)方法内部创建的小对象
2)对象没有逃逸

12.说说Java中堆内存的构成,以及对象的分配?

1)构成:年轻代(伊甸园区,2个幸存区),老年代
2)大部分新创建的实例对象都会存储在伊甸园区,假如比较大
且伊甸园区没有足够的存储空间,可以直接分配在老年代.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值