堆与栈分开设计是为什么呢?

  • 栈存储了处理逻辑、堆存储了具体的数据,这样隔离设计更为清晰
  • 堆与栈分离,使得堆可以被多个栈共享。
  • 栈保存了上下文的信息,因此只能向上增长;而堆是动态分配

线程栈

1、每当启动一个新线程的时候,java虚拟机都会为它分配一个java栈;

2、虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈;

3、它压入的每个栈帧(Stack Frame)是----程序指令  以及   局部变量表 ,每个方法调用对应一个栈帧。

局部变量表

包括==>:①各种基本数据类型;②对象的引用。

各种基本数据类型:

boolean、byte、char、short、int、float、long、double ;

4、我们需要注意到:每个 线程 都有 独立的栈 并且是互相隔离的。

栈的大小可以受到几个因素影响:

1️⃣一个是jvm参数 -XSS  ;

2️⃣除了JVM设置,我们还可以在创建线程Thread的时候手工指定大小: 

你在创建线程的时候参数传递进去,默认是1M

----------------------------------------------------------------------------------------

1、Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块;

2、Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建;

3、此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存;

①首先堆可以划分为新生代和老年代

新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 )

②新生代又可以划分为一个Eden区和两个Survivor(幸存)区

1、按照规定,新对象会首先分配在Eden中(如果对象过大,比如大数组,将会直接放到老年代)。

2、在GC中,Eden中的对象会被移动到survivor中,直至对象满足一定的年纪(定义为熬过minor GC【当Eden区满时,触发Minor GC】的次数),会被移动到老年代。

3、默认的,Eden : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。
③静态方法区,又称为永久代(Perm Generation)

它用于存储已被虚拟机加载的  类信息 ,常量, 静态变量, 即时编译后的代码   等数据

-----------------------------------------------------------------------------

①Minor GC  和 Full GC

Minor GC触发条件

:当Eden,Survivor区满时,触发Minor GC。

Minor GC ---采用的垃圾回收机制是 复制算法

因为:新生代每次垃圾回收倒要回收大部分的对象,也就说需要复制的操作次数较少,

但是在实际中并不是按照1:1比例来划分新生代空间的,一般来说,将新生代划分为一块较大的Eden代和两块较小的Survivor代,比例大概是

8:1:1;每次只是用Eden代,当进行回收时,将Eden代还存活的对象复制到一块Survor1对象中,然后清理掉

Eden代。第二次MinorGC会清理Eden代和Survor1,将对象存放到Survor2中,然后将Eden代和Survor1中的对象清理掉。当Survor2中的对象放不下的时候,会存放到 老年代;

Full GC触发条件:

(1)调用System.gc时,系统建议执行Full GC,但是不必然执行

(2)老年代空间不足

(3)方法区空间不足

(4)通过Minor GC后进入老年代的平均大小》大于老年代的可用内存

(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

使用到的垃圾回收算法:Mark-Compact算法

由于老年代的特点是每次回收的都是少量对象,一般使用的是 Mark-Compact 算法

转载于:https://www.cnblogs.com/yunshenbuzhichu/p/9676302.html

JVM总结---各处总结相关推荐

  1. (三)JVM成神路之全面详解执行引擎子系统与JIT即时编译原理

    引言 执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于"物理机"的概念,与物理机一样,都具备代码执行的能力.但 ...

  2. JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现

    引言 执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于"物理机"的概念,与物理机一样,都具备代码执行的能力.但 ...

  3. jvm有这一篇就够了,深入理解

    jvmHotSpot虚拟机对象探秘 对象的实例化 对象的内存布局 对象的访问定位 直接内存 执行引擎 StringTable 垃圾回收概述 垃圾回收相关算法 垃圾回收相关概念的概述 垃圾回收器 对象的 ...

  4. JVM 知识梳理 (二) GC算法

    文章目录 一.前言 二.判定哪些对象需要被GC 引用计数法Reference Count 可达性算法(引用链法Tracing) 三.GC算法 标记-清除 标记-压缩 复制算法 总结 分代收集 补充:H ...

  5. JVM内存调优原则及几种JVM内存调优方法

    JVM内存调优原则及几种JVM内存调优方法 1.堆大小设置. 2.回收器选择. 1.在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因 ...

  6. JVM 常见异常及内存诊断

    栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存. 栈帧过多导致栈内存溢出 下述示例代码,由于递归 ...

  7. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  8. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  9. 面试高频!JVM必备教程~

    请你谈谈你对JVM的理解?Java8虚拟机和之间的变化更新? JVM类加载器是怎么样的?有几种? 什么是OOM,什么是StackOverFlowError? 怎么分析? JVM常用调优参数有哪写? G ...

最新文章

  1. 让 Git 全局性的忽略 .DS_Store
  2. 【转】numpy-array自带的迭代器-----np.nditer
  3. web.xml filter 不包含_PHP文件包含
  4. ES6: 参数默认值及中间域
  5. 银行计算机储蓄系统程序流程图,银行储蓄系统流程图
  6. kubernetes 如何彻底删除pod、deployment、service
  7. 海康大华网络录像机摄像机设备几种NTP校时方法
  8. IBM p720 在HMC上创建分区并安装AIX系统
  9. StartActivity的2种用法
  10. 电脑开机后,显示屏无信号怎么处理?
  11. 编译安装Memcached
  12. linux中python怎么退出_linux 怎么退出python
  13. 正则测试以及练习网站
  14. B站网页版播放常用快捷键
  15. 知识分享之Golang——json与omitempty的使用
  16. 提交form表单方法
  17. ZUCC_计算机网络实验_实验01 实验一RJ45原理与制作
  18. 如何将NOAA官网下载的气象雷达原始数据转化为NC文件
  19. 中国四大发明是公认的
  20. FPGA NVME IP 核 纯逻辑实现NVME协议,读写SSD

热门文章

  1. C++代码片段(三)过滤可变模板参数中某些类型的变量
  2. Java堆排序递归_大顶堆第二弹----堆排序(递归实现)
  3. 浮点与定点的二进制存储
  4. iTunes 降级安装 12.6
  5. cp命令复制目录 不覆盖
  6. pixhawk博客导读
  7. Understanding Quaternions 中文翻译《理解四元数》
  8. OpenVINO安装之安装openCL
  9. [BUUCTF-pwn]——mrctf2020_shellcode
  10. 15.10.4 捕获异常