java虚拟机内存管理

  • 虚拟机运行时数据区

    • 线程共享

      • java Heap

        • java heamp是java虚拟机可配置管理的最大内存区;唯一的目的用于存储实例对象,所有线程共享;
        • GC堆,回收技术主要采用分代收集算法;java Heap细分为:新生代、老生代;划分本身与存放内容无关;无论怎么划分,都是为了更好的分配和回收内存;
        • 逻辑上连续,物理上未必连续;
        • 利用-Xms、-Xmx进行配置,无法分配及扩展时,将会抛出OutOfMerroyError错误;
      • method area
        • 存储对象:虚拟机加载的类信息、常量、静态变量、JIT编译器编译后的代码
        • alias name: Non-Heap
        • HotSpot虚拟机,Permanent Generation(永久代),实际上两者并不等价,将GC扩展到方法区;
    • 线程隔离
      • native method stack
      • program counter register
        • 线程私有;
        • java虚拟机多线程通过线程轮流切换并分配处理器执行时间;
        • 多线程轮流切换,必然需要在某刻恢复线程在上次执行的执行地址;例如一个线程在执行一个方法,计数器记录就是线程执行的虚拟机字节码指令的地址;如果是Native方法,那么计数器的值为空(undefined)
        • 唯一一个无OutOfMemoryError的内存
      • vms stack
    • 直接内存
      • direct memory, 并非是虚拟机运行时数据区的一部分;
      • NIO(new input/output), channel+buffer新型IO,利用Native函数库直接分配堆外内存;利用存储在java-heap中的DirectByteBuffer对象对该块内存进行直接引用操作;优点是避免在java-heap和native-heap之间进行来回复制数据
      • OutOfMerroyError错误;
  • 对象

    • 内存分配方式

      • 指针碰撞(bump the pointer)---ParNew、Serial
      • 空闲列表(Free List)  --- CMS(Mark-Sweep)
    • 决定条件
      • 垃圾收集器是否带有压缩整理==>java-heap是否规整
    • 内存分配策略
      • 目的:解决冲突问题
      • 方法一:CAS + 错误重试===>保证更新操作的原子性
      • 方法二:线程在不同的空间预分配内存(java-heap),预分配内存称之为TLAB(Thread Local Allocation Buffer),那个线程需要分配内存,就在那个线程的TLAB上分配,只有TLAB用光后分配新的TLAB时,才需要同步锁定;虚拟机是否使用TLAB,通过-XX:+/-UseTLAB参数配置;
    • 内存布局
      • header、Instance Data、Padding(对齐填充)
      • header: 对象的HashCode\偏向线程ID\GC分代年龄\锁状态标志\类型指针(对象指向它的类元数据的指针)
      • Padding无真实意义;保证数据长度是8字节的整数倍
      • Instance Data: 父类和子类可能会交叉存储,较小的子类变量可能会插入到父类变量的空隙之中;相同长度的字段总被分配到一起,如:shorts/chars、longs/doubles
    • 对象访问
      • 句柄、直接指针
      • 区别
        • 句柄方式访问数据 --- reference(句柄地址)-->句柄池(存放数据指针)--->对象指针-->数据

          • 优势:数据移动,reference不用动
        • 直接指针 ----reference(对象指针地址)-->对象指针-->数据
          • 优势:访问数据块
  •  JVM Error

    • java-heap配置

      • -Xms(堆最小), -Xmx(堆最大)

        • 不可扩展:设置相同
        • -XX:+HeapDumpOnOutOfMemoryError: 当出现内存溢出异常时,Dump出当前的内存堆的存储快照
    • 分类
      • 堆溢出

        • memory leak(内存泄露)
        • memory overflow(内存溢出)
      • 栈溢出(虚拟机、本地方法)
        • -Xss决定
        • 出现场景
          • 线程请求栈深度>虚拟机允许深度  -->StackOverfolwError
          • 虚拟机在扩展栈时未申请到足够内存 -->OutOfMemoryError
      • 方法区、运行时常量池
        • -XX:PermSize -XX:MaxPermSize
        • String.intern(),Native方法,作用:如果常量池中有对应String对象,那么返回;如果没有,将对应的字符串放入常量池;具体用法:String.ValueOf(i++).intern()
      • 直接内存
        • -XX:MaxDirectMemorySize,如果不指定,默认等于-Xmx取值相同
时间: 2024-10-11 10:01:05

java虚拟机内存管理的相关文章

Java虚拟机内存管理机制

自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范 第2版>规定,运行时数据区包括: 1.程序计数器 一块较小的内存空间,不在Ram上,而是直接划分在CPU上的,程序员无法直接操作它.当前线程所执行的字节码的行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令.每条

关于java虚拟机内存管理的一些讲解

java数据类型: 1)原始类型:Primitive Types(原始值) 数值类型(Numeric Types) 整型类型(Integral Types),浮点类型(Floating-Point Types) 布尔类型(Boolean Types) returnAddress类型:表示一条字节码指令的操作码(Opcode).在所有的虚拟机支持的原始类型之中,只有 returnAddress 类型是不能直接 Java 语言的数据类型对应起来的. 2)引用类型:Reference Types(引用

(三)java虚拟机内存管理和线程独占区和线程共享区

一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址:如果正在执行的是Native方法,这个计数器值则为空(Und

深入理解Java虚拟机—内存管理机制

前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思了.下面让我们来详细介绍下这五部分: 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁. 先让我们了解下进程和线程的区别: 进程是资源分配的最小单位,线程是程序执行的

Java虚拟机内存管理原理基础入门

Jdk:Java程序设计语言.Java虚拟机.Java API类库. Jdk是用于支持Java程序开发的最小环境. Jre:Java API类库中的Java SE API子集.Java虚拟机. Jre是支持Java程序运行的标准环境. Program Counter Register:较小的内存空间,可以看作当前线程所执行的字节码的行号指示器.是唯一一个Java虚拟机规范中没有规定OutOfMemoryError的区域. VM Stack:生命周期和线程相同,它描述了Java方法执行的内存模型:

探秘Java虚拟机——内存管理与垃圾回收

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt106 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB):默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 -Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小

探秘Java虚拟机——内存管理与垃圾回收(转)

本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB):默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制 -Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制

深入理解java虚拟机---java虚拟机内存管理(六)

java虚拟机栈的理解 虚拟机栈就是我们所熟知的栈内存,栈内存属于线程独有的.而在栈内存中的局部变量表中存储的引用类型只是存储对象的内存地址.对象的创建在堆内存中,即对象在线程共享区中. 局部变量表: 局部变量表的内存空间在编译时期完成分配,用于存放编译期间可知的各种基本数据类型,引用类型以及returnAdress类型.就是我们所熟知的栈内存. 模拟栈内存溢出 当在一个线程中不停的死循环调用一个方法时,因为方法的执行会在帧分配固定内存的大小,所以不停调用方法(前一个方法未执行完成弹出栈),会在

java虚拟机——内存管理与垃圾回收机制

一  java内存区域与内存溢出异常(OOM) 1.运行时数据区域划分