首页 > 编程语言 > 详细

java--JVM--栈(stack)和堆(heap)

时间:2021-06-06 00:36:11      阅读:29      评论:0      收藏:0      [点我收藏+]
  1. java 栈(java stack):
    1. 解释:
      • 栈管运行,堆管存储
      • 程序=算法+数据结构
      • 程序=框架+业务逻辑
      • 队列(FIFO)
      • 栈(FILO) 
      •  java 方法 = 栈 帧,在java中叫main 方法,进入栈中叫 栈帧
    2. 栈是什么
      1. 技术分享图片
    3. 栈存储什么

      1. 八种数据类型,对象的引用变量,实例方法  

      2. 栈帧(方法中)中主要保存3类数据:

        • 本地变量(Local Variables) :输入参数和输出参数以及方法内的变量

        • 栈操作(Operand Stack) |: 记录出栈、入栈的操作;

        • 栈帧数据(Frame Data) :包括类文件、方法等等(八种基本类型的变量,对象的引用,实例方法)

      3. 局部变量,实例方法,对象的引用
    4. 栈的运行原理
      1. 技术分享图片
      2. 技术分享图片

    5. 栈出现的错误(Error级别的错误):栈内存溢出异常(SOF):Exception in thread "main" java.lang.StackOverflowError 

      1. 技术分享图片

  2. 堆+栈+方法区交互的关系

    1. 栈中存储:八种基本数据类型(byte,short,int ,long ,float,double ,bloon,char,boolean)+对象的引用(reference)+实例方法 (对象的引用指向堆) 

    2. 堆中保存了: 对象的实例 (指向方法区中的对象结构信息)
    3. 方法区中保存了:类的结构信息(类的模板),静态 方法和变量,常量
    4. 技术分享图片
    5. JDK的名字=HostSpot
  3. 堆(Heap)

    1. 分类
      • 新生代(NEW)

        1. 伊甸区
        2. 幸存者0区
        3. 幸存者1区  
      • 老年代(OLD)

      • 元空间

      • 永久代 

      • java 8 逻辑上分为:新生区,养老区,元空间
      • java 8 物理上分为:新生区,养老区
      • java 7逻辑上分为: 新生区,养老区,永久存储区
      • java 7 物理上分为:新生区,养老区
    2. 是什么

      • 技术分享图片技术分享图片

    3. 新生区,养老区,元空间

      1. 技术分享图片

      2. 新生区:

        1. 伊甸区

        2. 幸存者0区(S0)别名:from

        3. 幸存者1区(S1)别名:  to  

      3. 技术分享图片

      4. 技术分享图片
      5. 技术分享图片

  4.  堆参数调优

    1. JDk7

      1. 技术分享图片

              

    2. jdk8 (OOM :对内存溢出)

      1. 技术分享图片
      2. 技术分享图片

    3. JVM调优简介
      1. 技术分享图片
      2.  堆逻辑上分为:新生区,养老区,元空间

      3.  物理上分为:新生区,养老区

    4. 配置参数演示和堆的内存证明: 

      1. 从对空间内存=新生区内存+养老区内存 ,可以看出物理上堆没有包括元空间,且配置的参数生效
      2. 技术分享图片
      3. 技术分享图片

    5. 模拟栈内存溢出错误

      1. package com.model.jvm;
        
        public class Test03 {
            public static void main(String[] args) {
        //        Runtime.getRuntime(): -> JVM运行时数据区的对象
                System.out.println(Runtime.getRuntime().availableProcessors());
                Long maxMemory=Runtime.getRuntime().maxMemory();  //返回java虚拟机的试图使用的最大内存量
                Long totalMemory=Runtime.getRuntime().totalMemory(); //放回虚拟机的总内存量
                System.out.println("-Xmx:MAX_MEMORY="+maxMemory+"(字节);"+(maxMemory/(double)1024/1024)+"MB");
                System.out.println("-Xms:TOTAL_MEMORY="+totalMemory+"(字节);"+(totalMemory/(double)1024/1024)+"MB");
        
            }
        }
      2. 技术分享图片
      3. 技术分享图片
    6. GC日志信息分析

      1. 技术分享图片
      2.  GC日志详情

        1. [GC (Allocation Failure) [PSYoungGen: 1973K->480K(2560K)] 1973K->771K(9728K), 0.0418826 secs] [Times: user=0.00 sys=0.00, real=0.06 secs] 
        2. 技术分享图片
      3. Full GC日志详情

        1. [Full GC (Allocation Failure)

        2. [PSYoungGen: 0K->0K(2048K)]

        3. [ParOldGen: 4207K->4187K(7168K)] 4207K->4187K(9216K),

        4. [Metaspace: 3227K->3227K(1056768K)], 0.0063580 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

        5. 技术分享图片技术分享图片 

java--JVM--栈(stack)和堆(heap)

原文:https://www.cnblogs.com/zzhAylm/p/14853852.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!