• JVM相关问题


    1.介绍下垃圾收集机制(在什么时候,对什么,做了什么)。

    在什么时候:
    1.新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一次发生在新生代的minor GC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survivor区的内存。在某次GC过程中,如果发现仍然又放不下的对象,就将这些对象放入老年代内存里去。
    2.大对象以及长期存活的对象直接进入老年区。
    3.当每次执行minor GC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次Full GC以尽可能地获得老年区的空间。
    对什么东西:从GC Roots搜索不到,而且经过一次标记清理之后仍没有复活的对象。
    做什么: 新生代:复制清理; 老年代:标记-清除和标记-压缩算法; 永久代:存放Java中的类和加载类的类加载器本身。
    GC Roots都有哪些: 1. 虚拟机栈中的引用的对象 2. 方法区中静态属性引用的对象,常量引用的对象 3. 本地方
    友情链接:Java GC的那些事(上)
    友情链接:Java GC的那些事(下)
    友情链接:CMS垃圾收集器介绍

    
    

    2.垃圾收集有哪些算法,各自的特点。


    3.类加载的过程。

    1.装载:将Java二进制代码导入jvm中,生成Class文件。
    2.连接:a)校验:检查载入Class文件数据的正确性 b)准备:给类的静态变量分配存储空间 c)解析:将符号引用转成直接引用
    3:初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。
    双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成 用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。

    友情链接:深入理解Java虚拟机笔记—双亲委派模型 
    友情链接:JVM类加载的那些事
    友情链接:JVM(1):Java 类的加载机制


    4.双亲委派模型。


    5.有哪些类加载器。


    6.Java虚拟机的内存布局


    7.Java内存模型

    Java虚拟机规范中将Java运行时数据分为六种。
    1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。
    2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。
    3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。
    4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。
    5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。
    6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。

    友情链接: Java中JVM虚拟机详解


    8.happens-before规则

    1.程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
    2.监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
    3.volatile变量规则:对一个volatile域的写,happens- before于任意后续对这个volatile域的读。
    4.传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。
    5.线程启动规则:Thread对象的start()方法happens- before于此线程的每一个动作。


    9.JAVA 中堆和栈的区别,说下java 的内存机制

    a.基本数据类型比变量和对象的引用都是在栈分配的

    b.堆内存用来存放由new创建的对象和数组

    c.类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中

    d.实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

    e.局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

  • 相关阅读:
    eclipse中创建完整的maven项目
    Nginx+tomcat配置集群负载均衡
    Git的安装与使用
    Angularjs checkbox的ng属性
    chrome渲染hover状态tranform相邻元素抖动bug
    nodejs创建express+ejs项目
    ubuntu常用命令
    ubuntu查看命令
    sublime text2卸载和重新安装
    fiddler代理
  • 原文地址:https://www.cnblogs.com/dsgerblog/p/10559996.html
Copyright © 2020-2023  润新知