第一块是堆,第二块是垃圾收集器,这就是咱们要讲的两块堆是JAVA中非常关键非常核心的一部分,因为JAVA实例化出来的一些对象,都是存在内存堆空间中的,几乎所有的对象都放在其中,且JAVA堆完全是由垃圾回收系统自动管理的,不是像C语言要手动写一个命令GC的那种东西,堆是自动管理的,是通过垃圾回收系统自动化管理的,通过垃圾回收机制,我们会把这个对象自动去清理,不需要像其他语言比如C显示的是释放,然后根据垃圾回收机制的不同,注意我的PPT写了,JAVA堆中可能有不同的结构,总的区域是一定的,最为常见的就是将整个堆分为新生代和老年代这两个大块,一大块就是叫做新生代,一大块就是叫做老年代,这是面试问的非常多的,JAVA堆知道是怎么划分的吗,JAVA新生代存放新生产出来的对象,老年代就存放已经生产很久的对象,新生代就是年龄不大的对象,老年代就是年纪很大的对象,具体它是怎样划分的呢,新生代又分成3个区域,分为eden区,s0区,s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以互换角色的空间,他们指的是s0和s1区
其实在我们的JAVA中堆就这么一块空间,称之为JAVA的heap,它分为两大块,整体上分为2大块,第一大块叫做新生代,第二大块叫做老年代,这是最外面最宏观的一次划分,然后关于新生代这块,有分为3块区域,首先第一块叫做eden区,为什么叫做eden呢,这个翻译过来叫做伊甸园,所以我们给他取个名字叫eden,其实我们的JAVA对象刚刚实例化出来的时候,刚new出来的时候,这个对象是放在eden区的,然后经过1次垃圾回收机制,经过1次GC就是、垃圾收集器,就是这个对象看有没有用了,比如这个代码写完以后,只要他经历过一次GC的话,user对象就会从Eden区域出来,出来不是直接到老年代,它就会到s0和s1区域,或者叫做from和to,s0和s1区域他们两个是什么概念呢,这两块区域是两块大小相等,并且是可以相互转换角色的空间,为什么要这么去设计呢,说明我们JAVA的对象,user经历过1次GC以后,会到s0或者是s1区,就是这对象可能是到s0区,也可能是s1区,就不可能是这个对象既在s0区也在s1区,说明就在我们这个JAVA中对象要么都存在s0区,要么都存在s1区,就是如果一个对象存在s0区,那s1区就不会有任何对象,如果有对象存在s1区,s0区就没有任何对象,所以他们就是两个大小相等,并且可以想换转换角色的空间,为什么我们的JAVA虚拟机是这么去设置的呢,在老年代里就无所谓了,老年代就是经历过多少次GC以后比如我们JAVA里面默认是经过15次GC以后,它就会从新生代晋升到老年代,但是我们唯一不理解的就是s0和s1咱们的JAVA虚拟机为什么设计成这种形式,s0和s1这一块可能不理解,那根据我们刚才所描述的概念.大多数情况下,我们的对象首先分配在eden区,在一次新生代回收之后,也就是垃圾回收之后,如果还存活着,如果程序还用着这个user,那么这个对象就会进入到s0或者s1区,因为不可能两个都有,每次经历GC操作的时候,如果我们的对象一直存活,那它的年龄就加1,也就是第一次回收了,发现还被程序使用者,那就加1,第2次GC再加1,一直加到15的时候OK,无论是s0区也好,还是s1区也好,这个对象就会直接扔到老年代这块,在这里简单跟大家说一下

垃圾收集算法,其中有一个非常经典的算法,就是复制的算法,其核心就是将内存空间分为两块,每次只能使用其中的一块,在垃圾回收的时候,将正在使用的内存中的存留的对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中所有的对象,反复去交换两个内存的角色,完成垃圾收集,你该明白新生代和老年代是一个什么样的概念了,它就是一个交替呼唤的角色,为什么要这么去设计呢,咱们单独来分析新生代的s0和s1这两个区间他们是两块大小相等并且可以呼唤角色的空间,我们这边叫做新生代,其实在我们的JAVA里边,你写程序写了很多代码,你在应用系统里边,很多对象就用了一次,或者调用的时候就用了一次,它不可能常驻在我们的内存中的,所以对一用完了就马上被回收,所以就在新生代的时候,垃圾回收太频繁了,并且需要垃圾回收的对象也太多了,比如现在我们的程序创建了100个Object,在这100个对象中,可能仅仅百分之1或者百分之2,这是比较常见的,就是100个对象里面只有1个或者2个存活在15次以上,存活15次以上才会存放在老年代,一般的JAVA对象经历了几次的GC之后,都会被我们的垃圾回收机制给回收掉,并且在我们的新生代产生对象实在是太频繁,老年代产生的GC要少于新生代很多很多,因为你的这个对象已经经历了15次的淘汰了,还没有被回收,老年代的对象在我们老年代的周期,你的这个JAVA程序或者servlet,tomcat的启动到关闭的整个生命周期内这个对象始终都在用着,但是绝大部分的对象在新生代生产消亡,分配空间,经历几次GC之后就消亡了,我们有n个对象放在s0区,然后我们采用的是复制的算法,比如我们这里有100个对象,有40个对象还,咱们的垃圾回收机制怎么做呢,这40个还存活的对象copy到s1去,剩下就不管了,清空这块s0区,下次我们就用我们的s1区,下次我们GC的时候,还有20个还存活着,然后再把s1的20个再copy回来,可能就是一个递归了,其实就是源源不断有新的对象产出,然后由老的对象经历过几次GC被回收的情况,这个就是一个概念性的问题,为什么要使用复制算法,就是因为新生代太频繁了,对象的产生和被垃圾回收走太频繁了,所以我们要有一种复制的算法,然后去清空空间,这两个角色相互交替的转换
其实就是一个概念性的问题,其实真正工作的时候用的不是特别的多,复制肯定不会包括eden区,eden区就包括对象,对象经历过一次GC之后肯定从eden区出来,到咱们的s0或者s1
JAVA栈就是咱们线程的一块私有空间,每一个线程你去实例创建的时候会有一个Thread,你会发现栈和我们的线程是息息相关的,调用多少次,比如深度什么的,后期咱们看代码就知道了,栈咱们也分三个部分,局部变量表,操作数栈,帧数据区,这三个东西比较拗口.1. 局部变量表: 用于报错函数的参数及局部变量2. 操作数栈: 主要保存计算过程的中间结果,代码写一个冒泡排序,你写代码的时候就有一个临时转换的角色,临时变量的转换角色3. 帧数据区: 也是用于处理一些异常,函数的返回结果或者出现异常,必须有一个异常处理表,其实局部变量表和帧数据区差不多,一个是函数报错参数的存储,还有一个是返回结果报错存储的,涉及到了一些常量的指针,因为很少有人读一下JAVA虚拟机源码,因为肯定是用C写的,只要存一些打印的信息就行了,然后咱们临时变量的存储呢,是存在操作数栈这个东西里,那咱们最简单明了的一句话,栈存的都是一些临时变量,方法中肯定会写一行一行的代码,然后变量相互的去转换,具体内部可能是通过这3分区域去进行维护的,你可以不用了解的非常详细,这块你有兴趣你可以去查查资料,一般不会问你栈太核心的,如果问了你可以反问他,你可以说记得栈里面分了局部变量表,操作数栈,帧数据区这三个部分,那我可能知道操作数栈写代码临时中间变量的转换,局部变量表和帧数据区是打印一些方法的入口,出口的一些异常,了解到这里就行了
JAVA方法区和堆一样,方法区是一块所有线程共享的内存区域,静态的,类的字段,方法,方法区的大小可以决定系统可以保存多少个类,如果系统定义的类太多,就会导致方法区溢出,你可能写了一个非常大的一块代码,你做了一个非常复杂的垂直化的系统,里面400、500个类,然后你给Tomcat的方法区几百个M,Tomcat就会报方法区的内存溢出,它会有这个提示,它就是永久区.虚拟机同样也会提示这种错误,现在我们其实不用面对这种问题,因为我们现在都是很多面多微服务,都是面向分布式的服务,一个服务不可能放一个非常复杂的业务系统,所以这个异常我们可以忽略,方法区就和我们创建多少个类直接关联.

jvm_堆栈永久区详细讲解相关推荐

  1. 未来网络发展的趋势——IPv6详细讲解与基本配置

    实验目的: 1. 掌握IPv6的基本工作原理: 2. 区别IPv6和IPv4有什么区别: 3. 掌握IPv6的一些新的特征: 4. 掌握IPv6的发展进程和部署情况: 实验拓扑: 实验步骤:   一. ...

  2. 30 道 Vue 面试题,内含详细讲解!

    1.说说你对 SPA 单页面的理解,它的优缺点分别是什么? SPA( single-page application )仅在 Web 页面初始化时加载相应的 HTML.JavaScript 和 CSS ...

  3. 【云原生】Docker数据卷及网络详细讲解

    前言 大家好,本文是对 Docker 数据卷及网络详细讲解,讲解了如何创建使用数据卷,以及如何使用 Docker network.希望对大家有所帮助~ 目录 前言 一.Docker 数据卷 1.1.数 ...

  4. Linux下函数调用堆栈帧的详细解释【转】

    转自:http://blog.chinaunix.net/uid-30339363-id-5116170.html 原文地址: Linux下函数调用堆栈帧的详细解释 作者:cssjtuer http: ...

  5. Vue 注意事项,内含详细讲解

    前言 转自[https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649091937&idx=1&sn=1d08ebe7 ...

  6. PE格式详细讲解4 - 系统篇04|解密系列

    PE格式详细讲解4 - 系统篇04 让编程改变世界 Change the world by program   到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的 ...

  7. PE格式详细讲解1 - 系统篇01|解密系列

    PE格式详细讲解1 - 系统篇01 让编程改变世界 Change the world by program 由于时间关系,这里只整理出必要的课件内容,详细请下载具体课件和详细讲解视频. [codesy ...

  8. AVA 8 :从永久区(PermGen)到元空间(Metaspace)

    你注意到了吗?JDK 8早期可访问版本已经提供下载了,java 开发人员可以使用java 8 提供的新的语言和运行特性来做一些实验.其中一个特性就是完全的移除永久代(Permanent Generat ...

  9. fanuc机器人码垛编程实例_FANUC 机器人码垛编程详细讲解 记得收藏!

    原标题:FANUC 机器人码垛编程详细讲解 记得收藏! 1. 码垛功能的定义 对几个具有代表性的点进行示教,即可以从下层到上层按照顺序堆叠工件. 2. 码垛的种类 码垛 B:包括码垛B(单路径模式)和 ...

最新文章

  1. java的rsa作用_java 中RSA的方式实现非对称加密的实例
  2. 06-GICv3_v4_overview
  3. #ps –ef_常用Linux中ps命令学习及ps aux与ps -ef的区别
  4. java二叉树代码_JAVA语言实现二叉树生成的代码教程
  5. 什么叫死锁?死锁案例?死锁必须满足哪些条件?如何定位死锁问题?有哪些解决死锁策略?哲学家问题?
  6. 爬虫使用urllib库报错urllib.error.URLError: 「urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate veri
  7. Python热门开源项目TOP10
  8. 预测纽约出租车行程时间
  9. 按键精灵易语言c,易语言插件按键精灵调用方法
  10. VirtualBox的菜单栏被隐藏的解决办法
  11. python中import re_彻底搞懂Python 中的 import 与 from import
  12. 深入理解5G SSB协议
  13. Centos7.5安装MySQL5.7
  14. html全屏轮播图插件,js全屏banner图片轮播插件
  15. AI项目环境搭建go+supervisor+openresty
  16. 白领十大职业病及对策
  17. 本地Java项目连接Linux系统上的Redis
  18. 连锁百货企业数据分析系统建设方案
  19. 两个栈实现队列的push-pop操作---C++
  20. CDA数据分析师2020年度精品试听集锦

热门文章

  1. 房地产仍是经济支柱行业 80%中小房企面临合并
  2. Web UI 用户管理部分 Bug报告
  3. [原创] 域模式下的ASP.NET 发邮件代码
  4. 在 Android 上使用协程(二):Getting started
  5. 架构成长之路:常见的五种MySQL高可用方案分析
  6. Usb设备驱动3:root hub守护进程2
  7. web office apps 在线预览实践
  8. 导出Excel java
  9. C/S构架和B/S架构的比较
  10. OpenDNS,独特的免费DNS