zoukankan      html  css  js  c++  java
  • jvm简介

    jvm是java的虚拟机,所有的java程序都必须运行在jvm上面。

    jvm是java的解释器,java程序编译成class文件后,装载入jvm中运行,jvm将class字节码解释为平台的机器码,平台执行机器码。

    jvm是进程级别,main()方法对应一个jvm进程。从java进入main()方法开始,jvm进程激活。

    一、jvm运行过程

    1、加载class文件;

    2、分配内存;

    3、解释字节码成机器码;

    4、运行过程垃圾收集;

    5、结束。

    如图所示:

    二、jvm结构

    1、类装载器(ClassLoader) 

    2、执行引擎(执行字节码)

    3、运行时数据区(方法区、堆、栈、pc寄存器、本地方法栈)

    如下图:

    三、jvm运行时数据区

    1、pc寄存器

    pc寄存器用于存储每个线程下一步将要执行的jvm指令,如果该方法为native,则pc寄存器不存储任何信息;

    2、jvm栈

    jvm栈是线程私有的,每个线程创建的同事都会创建jvm栈,jvm栈中存放的是当前线程中局部基本类型的变量(java定义的八种基本类型:boolean、char、byte、int、short、long、double、float)、部分的返回结果以及Stack Frame,对象在jvm栈上存放一个指向对象堆的指针

    3、堆(heap)

    它是jvm用来存储对象实例和数组的区域,可以认为java中所有通过new创建的对象都保存在这里。Heap中保存的对象需要GC进行动态回收。

    (1)堆是jvm中所有线程共享的,因此堆内对象内存的分配都需要进行加锁,这导致了new对象的开销比较大。

    (2)sun Hotspot JVM未了提升对象内存分配的效率,对于创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行情况计算得到,在TLAB上分配对象不需要进行加锁,因此JVM给对象分配内存时尽量在TLAB上分配,如果对象多大,则仍然会直接分配在堆的共享内存上。

    (3)TLAB仅作用于新生代的Eden Space,因此编写java程序时,通常多个小对象比大对象分配内存更高校。

    (4)所有新创建的Object都将会存储在新生代Young Generation中。如果Young Generation

    中的数据在一次或者多次GC后存活下来,将被转移到OldGeneration。

    4、方法区域(Method Area)

    (1)在sun JDK中这块区域对应的PermanetGeneration,成为持久代;

    (2)方法区域存放了所有加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义的final类型的常量、类中的Field信息、类中的方法信息。当开发人员在程序中通过Class对象中的GetName、isInterface邓方法获取信息,这些数据就是来源于方法区域,同时方法区域也是全局共享的 ,在一定条件下也会被GC。

    5、运行时常量池(Runtime constant Pool)

    存放类中固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。

    6、本地方法栈(native Method Stacks)

    JVM采用本地方法栈来支持native方法执行,此区域用于存储每个native方法调用状态。

  • 相关阅读:
    padStart()方法,padEnd()方法
    模板字符串
    Flask ==》 信号 and flash-session
    单例模式
    Git == > 版本控制
    Flask ==> 文件配置
    setitem和getitem和delitem
    Flask ==> 简单用户登录
    Flask
    Django ==> Model基础
  • 原文地址:https://www.cnblogs.com/run127/p/5490061.html
Copyright © 2011-2022 走看看