jvm(1)内存结构和对象

一,java历史

1.java之父:詹姆斯·高林斯

2.java发展简史

——1991年oak(嵌入式编程语言)

——1995 java(write once run anywhere )

——1996 jdk1.0(包含jvm Classic VM)

——1997 jdk1.1( 内部类,反射,jar文件格式)

——1998 jdk1.2(java开发三个方向,Hotspot VM)

——2000 jdk1.3(Timer)

——2002 jdk1.4(spring1.x struts hibernate,正则,Nio,日志)

——2004jdk1.5(自动装箱,泛型,注解,增强for循环,spring2.X)

——2006 jdk6(改名三个方向为java se... 开源)

——2009 jdk7(oracle收购sun公司74亿)

——2014 jdk8(lambda表达式 函数式编程)


二.java虚拟机产品

1.sun Classic VM

(1)世界上第一款商用的java虚拟机

(2)使用纯解释性的方式执行java代码

2.Exact VM

(1)Exact Memory Management 准确式内存管理

(2)编译器和解释器混合工作及两级即使编译器

3.HotSpot VM 

4.kvm

在手机平台运行

5.JRockit

(1)世界上最快的java虚拟机

(2)专注于服务器端应用

(3)优势(1)垃圾回收器(2)MissionControl服务套件

6.J9

    IBM公司为了执行自己的java代码专门研发的虚拟机

7.DALivk

(1)执行Dex文件(可由class文件转化而来)

8.Microsoft JVM

     oracle公司告了microsoft侵权,赔偿10亿

9.Azul VM Liquid VM

    高性能的java虚拟机

10.TaobaoVM

    阿里深度定制的产品,只适合它自己


三.java虚拟机


1.程序计数器

   (1) 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器

   (2)此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

2.java虚拟机栈

    java虚拟机栈描述的是java方法执行的动态内存模型

    栈帧

        每个方法执行都会创建一个栈帧,伴随着方法从创建到执行完成。

        用于存储局部变量表,操作数栈,动态链接,方法出口等 

        (1)局部变量表

        存放编译期可知的各种基本数据类型,引用类型

        局部变量表的内存在编译期完成分配


3.本地方法栈

    本地方法栈为虚拟机执行native方法服务

4.java堆

    存放对象实例

    垃圾收集器管理的主要区域

    新生代,老年代,Eden空间

5.方法区

    存储虚拟机加载的类信息(类的版本,字段,方法,接口),常量,静态变量,及时编译器编译后的代码等数据

    方法区中有一块常量池(有字符串常量池,运行时常量池)

    运行时常量---通过new在堆中创建的对象调用intern方法会把这个对象放到产量池中去


四.对象的创建

    1.对象的创建过程

                                            

2.给对象分配内存

    (1)指针碰撞(划分空闲区和占用区,通过移动指针实现划分)

    (2)空闲列表(有列表专门记录空闲的区域)

    内存分配策略其实是由垃圾回收策略决定的,如果分配策略有压缩整理的功能,把内存区域划分为规则的区域,可以使用指针碰撞

3.线程安全的问题

(1)线程同步(加锁)

(2)本地线程分配缓冲(为每个线程分配一块区域)

4.对象的结构

(1)header(对象头) 

        自身运行时数据 (Mark Word):哈希值   GC分代年龄  锁状态标志  线程持有的锁   偏向线程ID  偏向时间戳

            

        类型指针:

(2)InstanceData:真正存储对象的有效信息

(3)padding:填充  (相当于占位符)HotSpot要求对象的起始地址是8字节的整数倍,也就是对象的大小必须是8个字节的整数倍

5.对象的访问定位

(1)使用句柄

    栈中的引用指向堆中的句柄池,句柄池保存了真正的对象地址

    好处:引用地址不需要修改

(2)直接指针(hotspot采用)

    栈中的引用直接指向堆中的对象

    好处:减少寻找对象的时间



猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80828728