1、详细jvm内存模型
2、讲讲什么情况下回出现内存溢出,内存泄漏?
内存泄漏原因:对象是可达的(一直被引用),但对象不会被使用
nio?
概念
1.栈帧:局部变量表、操作数栈、动态连接、方法返回地址、附加信息 https://www.cnblogs.com/minisculestep/articles/4934947.html
参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html
3、说说线程栈?
JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。
当方法调用的时候,会生成一个栈帧。栈帧是保存在虚拟机栈中的,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息
线程运行过程中,只有一个栈帧是处于活跃状态,称为“当前活跃栈帧”,当前活动栈帧始终是虚拟机栈的栈顶元素。
4、JVM年轻代晋升到年老代的判断条件是什么?
MaxTenuringThreshold(15) 大于年轻代的一半(minor GC都装不下)
5、JVM出现full gc很频繁,怎么排查?
full gc频繁说明old区很快满了
如果一次full gc后,剩余对象不多,说明eden区设置太小了(年轻对象都往old区跑了)
如果一次full gc后,对象回收率很低,说明old区设置太小了(eden区都是空的,到年龄被迫赶到年老区)
6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?
①采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。
②毕竟核心类库是 bootstrap classloader 加载的,而 bootstrap 是内嵌于JVM的,在双亲委派模型基础上,任何类加载任务都会交由 bootstrap classloader 这位大佬经手过目一次,只要是核心类库中的类,都会被 bootstrap classloader 加载,间接确保核心类库不被其他类加载器加载。
作者:ZealTalk
链接:https://www.zhihu.com/question/49667892/answer/690161827
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
③防止内存中出现多份同样的字节码 ,如果不用委托而是自己加载自己的,那么类A就会加载一份System字节码,然后类B又会加载一份System字节码,这样内存中就出现了两份System字节码。
spi ?上下文类加载器?
7.字符串常量池
String s = new StringBuffer(“a”).append(“bc”).toString();
//此时常量池只有“a”和“bc” 没有“abc”
s.intern()==s // 1.7以后为 true
// 常量池没有“abc” intern()在常量池中保存“abc”对象的引用并返回该引用(1.7及以后)or 复制“abc”对象一份到常量池中并返回常量池中“abc”对象地址
字符串常量池存放的是字符串对象的引用,字符串本身是一个对象,而对象是存放到堆中。
“a”+“bc” 只有"abc"会被放入常量池
参考:https://blog.csdn.net/guoxiaolongonly/article/details/80425548
https://www.cnblogs.com/smallFishs/p/7944845.html
https://www.jianshu.com/p/2dc4c3dd5376
8.类中静态、非静态、构造方法的执行顺序
静态成员变量或代码块》非静态成员变量或代码块》构造方法
继承:父类静态成员变量或代码块》子类静态成员变量或代码块》父类非静态成员变量或代码块》父类构造方法》子类非静态成员变量或代码块》子类构造方法(子类共用父类静态变量,但是子类可自定义覆盖掉父类)
https://www.cnblogs.com/smallFishs/p/6185619.html