java--jvm--重点面试题4

  • 1.java虚拟机new一个对象的创建过程?
    

a.在常量池中查看是否有new的参数对应的类的符号引用,并检查这个符号引用对应的类是否被加载、解析、初始化
b.加载后,为新对象分配内存空间,对象所需要的内存大小在类被加载之后就被确定
c.将分配的空间初始化为零值。
d.对对象头进行必要设置。
f.执行方法,按照程序的值初始化。

  • 2.Java中创建子类实例时会创建父类实例吗?
    

不会。
构建一个对象时,jvm会在堆中给对象分配空间。这些空间用来存储当前对象实例属性以及其父类的实例属性(这些属性都是从方法区中获得)。这里不仅仅会给当前对象的实例属性分配空间,还需要给父类的实例属性分配空间。
总之,会为父类分配堆内存,但是这块堆内存属于子类的堆内存。

  • 3.java 的init方法和clinit区别
    

1.init 和 clinit 方法执行时机不同
init 是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行 init 方法,而 clinit 是类构造器方法,也就是在 jvm 进行类加载—验证—解析–初始化,中的初始化阶段 jvm 会调用 clinit 方法。
2.init 和 clinit 方法执行目的不同
很清楚 init 是 instance 实例构造器,对非静态变量解析初始化,而 clinit 是 class 类构造器对静态变量,静态代码块进行初始化。看看下 面的这段程序就很清楚了。
class X {
static Log log = LogFactory.getLog(); //
private int x = 1; //
X(){
//
}
static {
}
//
}

  • 4.java中方法区存放哪些东西?jvm如何控制方法区的大小以及内存溢出的原因和解决
    

方法区大小不是固定的,jvm可根据需要动态调整。方法区主要存放类信息、常量、静态变量、编译后的代码。
控制方法区大小:减少程序中class数量、尽量使用较少的静态变量
修改:-XX:MaxPerSize调大
StackOverflowError异常:线程的方法嵌套调用层次太多,随着Java栈中桢的增多,最终会由于该线程Java栈中所有栈帧总和大于-Xss设置的值而产生此异常。

  • 5.方法区什么时候会outofMemoryError?什么时候会?发生了如何解决?
    

如果你的APPload很多的class的话就会出现outofmemoryError.通过调节jvm参数-xx:maxpersize=256来调节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据学习爱好者

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值