• 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.方法区

    每天更新!!!

  • 相关阅读:
    三、视频操作
    C# SendKeys使用方法介绍
    3.如已交60%档,现想交提高缴费档次该怎么办?
    四、答疑解惑
    C# 获取当前网页HTML
    (二)灵活就业人员养老保险和医疗保险
    字符编码(转)
    .NET跨页面传值的方法
    正则表达式之匹配关系(转)
    javascript对DOM的常用操作
  • 原文地址:https://www.cnblogs.com/zzy8080/p/14176421.html
Copyright © 2020-2023  润新知