• 2018.8.25 JVM


    一、JVM内存区域

    Java虚拟机在运行时,会把内存空间分为若干个区域,根据《Java虚拟机规范(Java SE 7 版)》的规定,Java虚拟机所管理的内存区域分为如下部分:
        方法区
        堆内存
        虚拟机栈
        本地方法栈
        程序计数器。
    

    1、方法区

    方法区主要用于存储虚拟机加载的类信息、常量、静态变量,以及编译器编译后的代码等数据。在jdk1.7及其之前,方法区是堆的一个“逻辑部分”(一片连续的堆空间),但为了与堆做区分,方法区还有个名字叫“非堆”,也有人用“永久代”(HotSpot对方法区的实现方法)来表示方法区。
    
    从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把原本放在方法区中的静态变量、字符串常量池等移到堆内存中,(常量池除字符串常量池还有class常量池等),这里只是把字符串常量池移到堆内存中;在jdk1.8中,方法区已经不存在,原方法区中存储的类信息、编译后的代码数据等已经移动到了元空间(MetaSpace)中,元空间并没有处于堆内存上,而是直接占用的本地内存(NativeMemory)。
    
    去永久代的原因有: 
    (1)字符串存在永久代中,容易出现性能问题和内存溢出。 
    (2)类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。 
    (3)永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
    
    
    

    2.堆内存

    堆内存主要用于存放对象和数组,它是JVM管理的内存中最大的一块区域,堆内存和方法区都被所有线程共享,在虚拟机启动时创建。在垃圾收集的层面上来看,由于现在收集器基本上都采用分代收集算法,因此堆还可以分为新生代(YoungGeneration)和老年代(OldGeneration),新生代还可以分为Eden、From Survivor、To Survivor。
    
    

    3、程序计数器

    程序计数器是一块非常小的内存空间,可以看做是当前线程执行字节码的行号指示器,每个线程都有一个独立的程序计数器,因此程序计数器是线程私有的一块空间,此外,程序计数器是Java虚拟机规定的唯一不会发生内存溢出的区域。
    
    
  • 相关阅读:
    关于c++中的volatile
    关于Windows音频相关
    关于iOS库冲突问题
    UIView controller 大小初始化
    模板函数
    linux 服务器运维常用命令
    flink高可用nfs配置注意点
    destoon7.0-8.0解决pc端“您的页面可能存在图片不可全屏查看”百度移动落地页检测问题方法
    destoon7.0-8.0移动端自动推送百度,配合pc实现快速收录
    php在线运行学习工具,可以在线运行调试php代码
  • 原文地址:https://www.cnblogs.com/qichunlin/p/9495932.html
Copyright © 2020-2023  润新知