1.Java虚拟机内部有哪些线程共享,那些线程隔离
程序计数器:
通过改变这个计数器的值来选取下一条需要执行的字节码命令
Java虚拟机栈:
栈,每个方法被执行时,Java虚拟机都会同步的创建一个栈帧用于存储局部变量表,操作数栈,动态连接,方法出口等信息。
本地方法栈:
本地方法服务
堆:
所有线程共享
方法区:
存储已加载的类型信息:常量,静态变量,即时编译器编译后的缓存数据
常量池:是方法区的一部分
作用:减少重复创建和销毁,类似于缓存,提升速度
为什么有时候运行Java很卡?
大量IO操作占用本地内存
2.什么是内存溢出,栈溢出,内存泄漏?
内存溢出:创建对象内存不够
栈溢出:方法太多
内存泄漏:数据没用还占据内存倒是空间无法使用
3.如何进行JVM调优
通过Java visual VM jvisualvm.exe(位于bin目录下)
4.jvm中如何判定是否为垃圾
可达性分析算法
5.几种引用方式?
强引用:
传统引用的定义,只要强引用关系还在,垃圾收集器就不会回收被引用的对象
软引用:
用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内
存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。
弱引用
用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只
能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只 被弱引用关联的对象。
虚引用
6.垃圾收集算法目的?有哪些:
性能损耗最低。
标记清除算法:
标记出所有需要回收的对象,标记完成后统一回收掉所有标记的对象,也可以反过来。
缺点:1.执行效率不稳定,如果存在大量的需要回收的对象,那么执行效率就会降低。
2.内存空间碎片化。
标记-复制算法:
为了解决标记清除算法面对大量对象回收效率低的问题
缺点:可用内存缩小了一半。
标记-整理算法:
标记过程仍然与标记-清除算法一样,但是后续由清理改为将所有存活的对象都向空间的一端移动。
7.有哪些垃圾收集器
CMS收集器
特点:并发收集,低停顿。依赖多核:降低CPU浪费的情况下是快的。无法处理“浮动垃圾”(在标记清除阶段因为线程还在运行,所以就会产生垃圾,但是发生在标记清除阶段之后,所以只能等到下一次处理)
Garbage First(G1)收集器
二者的区别:
CMS:垃圾收集的目标要么是老年代,要么是整个新生代
G1:面向堆内存的任何部分组成回收集,衡量标准改为内存中哪个部分存放的垃圾数量多,回收效益大。G1在小内存表现下不是很好,不如CMS。
8.介绍垃圾回收策略
大对象直接进入老年代
长期存活的对象直接进入老年代(大于15岁)
在Survivor空间中相同年龄的总和大于一半,大于或者等于改年龄的对象直接进入老年代。
9.什么情况下会触发垃圾回收?
内存满了的情况下
10.jvm调优有哪些参数
jps:虚拟机进程状况工具
jps [ options ] [ hostid ]
jstat [ option vmid [interval[s|ms] [count]] ]
jinfo [ option ] pid
jmap [ option ] vmid
jhat eclipse.bin //分析dump文件
jstack [ option ] vmid
11.内存分配与回收策略
12.类加载有哪几个过程?都有什么用
13.那种情况会触发类的初始化?
1)遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类型没有进行过初始 化,则需要先触发其初始化阶段。
能够生成这四条指令的典型Java代码场景有:
2)使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需要先触发其初始化
14.类加载器
作用:寻找类,并且加载类
如果自己写一个类加载器
/**
* 类加载器与instanceof关键字演示
*
* @author zzm
*/
public class ClassLoaderTest {
public static void main(String[] args) throws Exception {
ClassLoader myLoader = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try {
String fileName = name.substring(name.lastIndexOf(".") + 1)+".class";
InputStream is = getClass().getResourceAsStream(fileName);
if (is == null) {
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
throw new ClassNotFoundException(name);
}
}
};
Object obj = myLoader.loadClass("org.fenixsoft.classloading.ClassLoaderTest").newInstance();
System.out.println(obj.getClass());
System.out.println(obj instanceof org.fenixsoft.classloading.ClassLoaderTest);
}
}
15.通过什么方式寻找这个类
双亲委派模型
在哪里破坏双亲委派?tomcat
16.什么是热部署?
再不清空内存的情况下,不重启的情况下,更新内存中的类信息