java虚拟机内存区域

1.程序计数器:

    1.1程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的虚拟机字节码的行号指示器,如下图理解:

    1.2:程序计数器处于线程独占区:就是每个程序都会有他自己的程序计数器

    1.3:如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址(如上图的1.2.3.行数,但是不是按照这种形式保存地址),如果正在执行的是native方法,这个计数器的值为undefined。

    1.4:此区域是唯一一个在Java虚拟机规范中没有规定如何OutOfMemoryError情况的区域:由Java内部进行维护的。

    1.5:关于Java中有没有goto.  现在是不能用GOTO的Java中唯一一个保留字。以后可能会用到。


2.Java虚拟机栈:

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

    2.2:栈帧。每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储局部变量表,操作数栈,动态链接,方法出口等,如图:

2.3:局部变量表:存放编译期可知的各种基本数据类型,引用类型,returnAddress类型

局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,

方法运行期间是不会改变局部变量表的大小。

2.4:栈内存大小:当进栈的方法过多(如递归调用方法不正确时)就会导致栈溢出而出现StackOverFlowError

如下面的例子:


如果栈的深入不限定大小的话,那就会不停的进栈,比如栈内存大于虚拟机的内存时,就会报出一个OutOfMemory.

可能导致两种溢出,栈溢出或者Java溢出

3:本地方法栈:为虚拟机执行Java方法服务。

4:虚拟机栈:为虚拟机执行Java方法服务。

5:Java堆:存放对象实例,垃圾收集器管理的主要区域,新生代,老年代,Eden空间(后面会详细讲解)

-Xmx -Xms修改堆的大小

6.方法区:存储虚拟机加载的类信息(类的版本,字段,方法,接口 ;执行的方法基本都会放到方法区中)

,常量,静态变量,即时编译后的代码等数据。

    6.1:方法区和永久代 不等价。

    6.2:垃圾回收在方法区的行为:出现比较少,回收比较低一般是对常量池的回收,和对象类型的卸载。

    6.3:异常的定义:在申请内存失败的情况下也会抛出一个:OutOfMemoryError

7:java内存区域--直接内存和运行时常量池

        7.1:常量池是用来存放编译器生成的各种自变量以及符号引用,这部分内容将在内加载后

接入方法区的运行时常量池中存放。下面举个例子



所以字符常量存放的是常量池中,但是当new关键字创建对象的时候,他就不会再去考虑

常量池,而是直接再堆内存开辟一个空间 然后把地址赋给S3所以 S1==S2!=S3

        7.2:直接内存:    NIO中使用。(后面再详细了解)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
### 回答1: Java虚拟机主要分为以下几个内存区域: 1. 程序计数器(Program Counter Register) 2. Java虚拟机栈(Java Virtual Machine Stacks) 3. 本地方法栈(Native Method Stacks) 4. Java堆(Java Heap) 5. 方法区(Method Area) 6. 运行时常量池(Runtime Constant Pool) 7. 直接内存(Direct Memory) 其中,程序计数器、Java虚拟机栈、本地方法栈都是线程私有的内存区域Java堆、方法区、运行时常量池、直接内存则是线程共享的内存区域。 ### 回答2: Java虚拟机(JVM)中有几个重要的内存区域,它们分别是堆、栈、方法区、程序计数器和本地方法栈。 堆是Java程序最主要的内存区域之一,用于存储对象实例和数组。所有通过关键字new创建的对象都会在堆上分配内存。堆是被所有线程共享的内存区域,每个对象的实例变量在堆中占用一定的空间。 栈是一个线程私有的内存区域,用于存储线程的方法调用。每个线程在执行方法时都会在栈中创建一个栈帧,栈帧包含方法的参数、局部变量和返回值等信息。栈的操作是后进先出的,所以栈也被称为LIFO(Last In First Out)数据结构。 方法区(JDK 8及以前版本称为“永久代”)用于存储类的元数据信息,如类名、方法名、字段名和运行时常量池等。方法区也是被所有线程共享的内存区域。 程序计数器是一块较小的内存区域,它用来指示线程当前执行的字节码指令地址。每个线程都有一个独立的程序计数器,因此它是线程私有的。 本地方法栈与栈类似,但用于执行本地方法调用(Native Method)。本地方法是用C或C++等本地语言编写的方法,它们可以直接在系统级别访问硬件设备或其他资源。本地方法栈也是线程私有的。 总之,Java虚拟机内存区域包括堆、栈、方法区、程序计数器和本地方法栈。这些内存区域各有不同的作用,用于支持Java程序的执行和对象的管理。 ### 回答3: 在Java虚拟机中,主要有以下几个内存区域: 1. 程序计数器(Program Counter Register): 程序计数器是一块较小的内存区域,它保存着当前线程正在执行的字节码指令的地址。每个线程都有自己独立的程序计数器。 2. Java栈(Java Stack): Java栈用于存储Java方法的局部变量、参数、方法返回值以及一些操作数。每个线程的方法在执行时都会创建一个对应的栈帧,栈帧中存放了方法的信息。 3. 本地方法栈(Native Method Stack): 本地方法栈与Java栈类似,但它是为Native方法服务的。Native方法是使用其他语言(如C、C++)编写的方法,本地方法栈用于保存这些方法的本地变量。 4. Java堆(Java Heap): Java堆是Java虚拟机所管理的内存中最大的一块区域,被所有线程共享。Java堆用于存储对象实例和数组,是垃圾回收的主要区域Java堆可以分为新生代和老年代两个区域。 5. 方法区(Method Area): 方法区用于存储已被加载的类信息、常量、静态变量等数据。在方法区中还有一个叫做运行时常量池的区域,它存放着每个类的运行时常量信息。 6. 运行时常量池(Runtime Constant Pool): 运行时常量池是方法区中的一部分,用于保存编译器生成的各种字面量和符号引用。 除了以上几个内存区域Java虚拟机还包括了直接内存(Direct Memory)。直接内存并不是Java内存区域的一部分,它使用的是操作系统的内存,但可以被Java虚拟机直接访问,通常用于NIO(New IO)操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值