zoukankan      html  css  js  c++  java
  • java面试-JVM内存模型

    JVM探究

    1.JVM位置

    jvm是java运行环境, 在操作系统(window、linux、mac)之上, 操作系统在硬盘之上。

    2.jvm的体系结构

    3.类加载器

    1.(应用)根加载器

    2.扩展加载器

    3.应用加载器

    JVM类加载器加载.class文件, 将class问价读取到内存中,并创建一个java.lang.class对象。

    4.双亲委派机制

    当一个.class文件被加载时, 类加载器会交给父类加载器执行, 如果父类加载器下有这个java api类就会执行父类下面的类,并不会执行传入的类。应用加载器 -> 扩展加载器 -> 根加载器   如果父类都不存在就由应用加载器进行加载传入的类。如果传入一个java.lang.String类,在根加载器下会找到java api就会执行根加载器下的类, 并不会加载传入过来的java.lang.String类,增加类加载的安全性。

    5.沙箱安全机制

    6.native

    带有native关键字的, 说明java的作用范围到达不到, 回去调用C语言的库。会进入本地方法栈调用本地方法接口JNI。在最终执行的时候加载本地方法库中的方法通过JNI。

    JNI:扩展java的使用, 融合不同的编程语言为java所用。

    7.pc寄存器(程序计数器)

    每个线程都有一个程序计数器, 是线程私有的, 就是一个指针, 指向方法区中的方法字节码, 在执行引擎读取下一条指令,是一个非常小的内存空间。

    8.方法区

    静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池也存在方法区中。但实例变量存在堆内存中和方法区无关。

    9.栈

    栈是对每个线程共享的。

    为什么main()方法先执行后结束。main()方法首先放入在java栈中, java栈是先进后出。

    栈:栈内存, 主管程序的运行, 线程结束栈就释放。不存在垃圾回收的问题。

    栈:8大基本类型+对象引用+实例方法。

    10.三种JVM

    Sun公司 HotSpot (常用的)

    BEA公司

    IBM公司

    11.堆

    Heap, 一个JVM只有一个堆内存, 堆内存的大小是可以调节的。类加载器读取文件之后会把类、方法、常量、变量、引用类型的真实对象

    堆内存中包含三个区域:

    新生区young:

    老年区old:

    永久区perm:

    12.新生区、老年区

    13.永久区

    14.堆内存调优

    15.GC常用算法

    16.JMM(java内存模型)

    17.总结

    面试:

    1.谈谈你对jvm理解? java8虚拟机和之前的变化更新?

    2.什么是OMM,什么是栈溢出stackoverflowerror? 怎么分析?

    3.jvm常用调优参数那些?

    4.内存快照的抓取, 怎么分析dump文件?

    5.谈谈jvm类加载器的认识?

  • 相关阅读:
    Android动态加载jar/dex
    aiXcoder安装&使用
    笨办法学python 13题:pycharm 运行
    python2.7安装numpy、pandas、matplotlib库
    win10在文件夹下打开powershell
    SpringCloud:(一)服务注册与发现
    pycharm2018.2安装
    Python2.7安装&配置环境变量
    centos7配置NTP时间服务器
    centos7:Zookeeper集群安装
  • 原文地址:https://www.cnblogs.com/chong-zuo3322/p/14183529.html
Copyright © 2011-2022 走看看