JVM面试必备

JVM笔记

JVM含义

定义:Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境)

  1. 一次编写,到处运行

  2. 自动内存管理。垃圾回收功能

  3. 数组下标越界越界检查

  4. 多态

比较: jvm jre jdk

image-20201222155057206

JVM体系

image-20201222155747001

内存结构

1.程序计数器

1.1定义

Program Counter Register程序计数器(寄存器):记住下一条jvm指令的执行地址。

1.2作用

作用:是记住下一条jvm指令的执行地址

特点:.是线程私有的 .不会存在内存溢出

2.虚拟机栈

2.1定义

栈:线程运行需要的内存空间
栈帧:每个方法运行时需要的内存

  1. 每个线程运行时所需要的内存。称为虚拟机栈

  2. 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存

  3. 每个线程只能有一个活动栈帧。对应着当前正在执行的那个方法

1.垃圾回收是否涉及栈内存? 不涉及。

2.栈内存分配越大越好吗? 不是,分配的越大,线程数会变少。
3.方法内的局部变量是否线程安全? 是,方法内,共享的需要考虑线程安全,私有的不需要考虑。(本人回答)

如果方法内局部变量没有逃离方法的作用访问,它是线程安全的

如果是局部变量引用了对象。并逃离方法的作用方法,需要考虑线程安全

2.2栈内存溢出

栈帧过多导致栈内存溢出,栈帧过大导致栈内存溢出

/**
 * 内存溢出
 * 展示栈内存溢出 java.lang.StackOverflowError
 * -Xss256k
 * */
public class Demoneicunyichu {
    private static int count;
    public static void main(String[] args) {
        try {
            method1();
        }catch (Throwable e){
            e.printStackTrace();
            System.out.println(count);
        }

    }

    private static void method1( ) {
        count++;
        method1( );
    }
}
/**
 * json 数据转换
 * */
public class Demojsontransition {
    public static void main(String[] args) throws JsonProcessingException {
        Dept dept = new Dept();
        dept.setName("marry");

        Emp e1 = new Emp();
        e1.setName("wang");
        e1.setDept(dept);

        Emp e2 = new Emp();
        e2.setName("ba");
        e2.setDept(dept);

        dept.setEmps(Arrays.asList(e1,e2));
        // { name: 'marry', emps: [{ name:'wang', dept:{ name:'', emps: [ {}]} },] }
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(dept));
    }
}
class Emp{
    private String name;
    @JsonIgnore
    private Dept dept;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }
}
class Dept{
    private String name;
    private List<Emp> emps;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }
}

2.3线程运行诊断

3.本地方法栈

4.堆

5.方法区

每天更新!!!

posted @ 2020-12-23 01:02  Anthony-bird  阅读(80)  评论(0编辑  收藏  举报