JVM内存模型

运行时数据区结构及其特点

这里写图片描述
这里写图片描述

一 程序计数器

功能:

  • 存储当前线程正在执行的字节码行号
  • 如果当前线程执行的java方法:记录虚拟机字节码指令地址
  • 如果当前线程执行的native方法:该计数器的值为空

特点:
- 不会抛出outOfMemoryError异常
- 线程私有的

二 java虚拟机栈

功能:

  • 描述(java)方法执行时的内存模型
  • 方法调用的过程就是栈帧入栈到出栈的过程

特点:
- 线程私有的
- 请求栈深大于虚拟机所允许的栈深,抛出stackOverFlowError
- 虚拟机栈请求不到足够的内存来扩展空间,将会抛出outOfMemoryError

三 本地方法栈

功能:

  • 与虚拟机栈的功能类似,但虚拟机栈描述的java方法执行的内存模型本地方法则为虚拟机提供使用本地方法的服务

特点:
- 线程私有的
- 请求栈深大于虚拟机所允许的栈深,抛出stackOverFlowError
- 虚拟机栈请求不到足够的内存来扩展空间,将会抛出outOfMemoryError

四 java堆

功能:

  • 用于存放实例对象

特点:
- 线程共享的
- 虚拟机启动时创建,虚拟机关闭时结束
- 垃圾收集器管理的主要部分,也被称作GC堆(Garbage Collected Heap)
- 一般可扩展。但申请扩展内存失败的时候会抛出 outOfMemoryError

五 方法区

功能:

  • 存储 虚拟机加载的类信息 常量 静态变量 即时编译器编译后的代码

特点:
- 线程共享的
- outOfMemoryError

六 运行时常量池

功能:

  • 存放类在编译期生成的字面量 和 符号引用 和编译出来的直接引用

特点:
- 线程共享的
- outOfMemoryError
- 方法区的一部分

六 直接内存

功能:

  • 用于缓存i/o数据

特点:
- 不是虚拟机运行时数据区的一部分
- outOfMemoryError

补充:

什么是直接引用什么是符号引用?

在java中,一个java类将会编译成一个class文件。在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类 的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址

什么是栈帧??

       java在方法执行时会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出入口

什么是局部变量表

    存放基本数据类型 引用(reference) returnAddress(字节码指令的地址)
    局部变量表的大小在编译期间确定,运行期间局部变量表的大小是不会改变的

什么是JTT编译(即时编译器)??

解释与编译的区别:       
        解释:边执行边解释成机器语言,(吃火锅边吃边涮)    
        编译:先编译成机器语言在执行,(先做好一桌子菜,做好菜再吃)  
java编译语言还是解释语言?     
        第一步:    先利用javac命令解释成BYTECODE文件(字节码文件,.class文件) 
        第二步:    1) 使用jvm边解释边允许  
                2)使用JIT翻译(编译)成机器指令,直接执行 
                3)二次编译 生成静态的目标平台代码  

将发现程序中的热点位置 将本部分代码编译成本地机器码直接执行,这样会加快代码执行的效率     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值