本文主要是介绍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来调节。
这篇关于java--jvm--重点面试题4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!