内存模型

JVM架构图

内存模型

  • 程序计数器
  1. 当前线程所执行的字节码行号指示器(逻辑)
  2. 改变计数器的值来选取下一条需要执行的字节码指令
  3. 和线程是一对一的关系
  4. 对Java方法技术,如果是native方法则计数器值为Undefined
  5. 不会发生内存泄漏
  • 虚拟机栈
  1. Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(存储局部变量表,操作数栈,动态链接,方法出口等),当方法执行结束,对应的栈帧就会被自动释放掉,因此栈内存的回收不需要GC
  2. java.lang.StackOverflowError: 递归过深,栈帧数超出虚拟栈深度
    java.lang.OutOfMemoryError: 内存溢出

局部变量表和操作数栈(局部变量表为操作数栈提供必要的数据支撑):

  1. 局部表量表:包含方法执行过程中的所有变量
  2. 操作数栈:入栈,出栈,复制,交换,产生消费变量

    iconst_0 将0压入操作数栈
    istore_2 将操作数栈中的数pop,并存入局部变量
    iload_0 将局部变量中第0个数压入操作数栈
    iadd 相加
  • 本地方法栈

与虚拟机栈相似,主要作用于标注了native的方法

  • 方法区
  • 用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
  • 实现: 元空间(MetaSpace)和永久代(PermGen)
  • jdk7: 把原来放在永久代的字符串常量池移出,放入heap
  • jdk8:使用元空间替代了永久代

元空间与永久代:

  1. 区别:元空间使用本地内存,而永久代使用的是jvm的内存( java.lang.OutOfMemoryError:PermGen space)
  2. 元空间优势:
    – 字符串常量池存储在永久代中,容易出现性能问题和内存溢出
    – 类和方法的信息大小难以确定,给永久性的大小指定带来困难
    – 永久代会为GC带来不必要的复杂性
    – 方便HotSpot与其他JVM如Jrockit的集成
  • 堆(heap)
  1. 唯一目的:存放实例对象
  2. GC管理的主要区域
元空间,堆,线程独占部分间的联系


常见面试问题
  1. JVM三大性能调优参数 -Xms -Xmx -Xss
  • -Xms:堆的初始值
  • -Xms:堆能达到的最大值
  • -Xss:规定了每个线程虚拟机栈(堆栈)的大小
  1. Java内存模型中堆和栈
    详细介绍

JVM堆和JVM栈中,JVM栈是程序运行最根本的东西。程序运行可以没有JVM堆,但是不能没有JVM栈。而JVM堆是为JVM栈进行数据存储服务,说白了JVM堆就是一块共享的内存。不过,正是因为JVM堆和JVM栈的分离的思想,才使得Java的垃圾回收成为可能。

内存分配策略:

  1. 静态存储:编译时确定每个数据目标在运行是的存储空间需求(static)
  2. 栈式存储:数据区需求在编译时未知,运行时模块入口前确定
  3. 堆式存储:编译时或运行时模块入口都无法确定,动态分配

区别:

  1. 管理方式:栈自动释放,堆需要GC
  2. 空间大小:栈比堆小
  3. 碎片相关:栈产生的碎片远小于堆
  4. 分配方式:栈支持静态和动态分配,而堆仅支持动态分配
  5. 效率:栈的效率比堆高

堆栈为什么分离:

  1. 从软件设计的角度看,栈代表了逻辑处理,而堆代表了数据,这样分离是的处理逻辑更为清晰
  2. 堆与栈的分离,使得堆中的内容可以被多个栈共享
  3. 堆的大小可以根据需求动态增长,分离使得动态增长成为可能,相应栈中只需要记录堆中的首地址即可
  4. 栈主要用来执行程序,堆主要用来存放对象,为栈提供数据存储服务。也正是因为堆与栈分离的思想才使得JVM的垃圾回收成为可能
  1. intern()

3.1 概述
3.2 JDK6

  • false
  • false
  • " "中声明的字符串都会直接在常量池中创建,new出来的对象都是在heap区域,如果字符串常量池中没有,创建heap的副本放入,如果有,则放不进去,对于s,先在常量池创建,再在堆中new,所以放不进去;但即时放进去,指向的也不是一个对象

3.3 JDK7及以上

  • false
  • true
  • jdk7: 把原来放在永久代的字符串常量池移出,放入heap
  • 如果字符串常量池中没有,将字符串的**引用(而不是副本)**放入其中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值