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)局部变量表

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

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

        (2)操作数栈

        存储的计算的中间结果

        (3)动态连接

        该栈帧所属的方法的引用

        (4)方法出口

        方法的调用是通过一个指针方法的指针指向方法的地址,方法返回时将回归到调用处,那个地方是返回地址(正常)

        或者在异常时抛出的异常

        

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采用)

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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM(Java虚拟机)的内存结构主要包括以下几个部分: 1. 方法区(Method Area):用于存储类的结构信息,如类的字段、方法、常量池等。方法区是所有线程共享的。 2. 堆(Heap):用于存储对象实例。堆是所有线程共享的,是Java程序中动态分配内存的主要区域。 3. 虚拟机栈(VM Stack):每个线程在执行Java方法时都会创建一个栈帧,用于存储局部变量、操作数栈、方法出口等信息。 4. 本地方法栈(Native Method Stack):与虚拟机栈类似,但是用于执行本地方法(非Java代码)。 5. 程序计数器(Program Counter Register):用于记录当前线程执行的字节码指令地址。 此外,JVM还有一些其他的内存区域,如直接内存(Direct Memory)和运行时常量池(Runtime Constant Pool)等。 关于JVM内存模型,它定义了多线程并发访问内存时的行为规范。JVM内存模型主要包括以下几个概念: 1. 主内存(Main Memory):所有线程共享的内存区域,包含堆、方法区等。 2. 工作内存(Working Memory):每个线程独享的内存区域,包含虚拟机栈、本地方法栈等。 3. 内存间交互操作:线程之间通过主内存进行数据的共享和通信。 4. 原子性、可见性和有序性:JVM保证特定操作的原子性(不可分割)、可见性(一个线程对共享变量的修改对其他线程可见)和有序性(指令重排序的限制)。 5. happens-before关系:JVM定义了happens-before关系来规定多线程之间操作的执行顺序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值