Jvm的内存布局和垃圾回收机制

内存布局

运行时数据区

虚拟机

  1. 程序计数器:用来控制代码运行行数。
  2. Java 虚拟机栈:每个线程运行方法(A调用B)时,先把A方法放入到栈底,然后加载B方法,B方法放在A方法栈帧上,执行完B方法,弹出栈,随后A弹出栈。对应着一个栈帧出栈入栈的过程。
  3. Java堆:是Java虚拟机管理的最大的内存区,是所有线程可共享的,对象实例在这里被分配内存,是垃圾收集器(GC)管理的主要区域。
  4. 方法区:保存已被虚拟机加载的类信息(实现的接口、继承的父类等等)、常量、静态变量即时编译器编译后的代码,运行时常量池。
  5. 直接内存:不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域。大部分是Java的io操作使用。
  6. 内存布局变化

垃圾回收机制

1. 标记算法,容易出现碎片。

2. 复制算法,由于每次只用一半,总是有一半的内存空间浪费。

<!-- ![mark](https://img-hello-world.oss-cn-beijing.aliyuncs.com/16630c6540e9b655f223f10d78d57701.png) -->

3. 标记-整理算法,存在内存块的移动,对性能有一些影响。

<!-- ![mark](https://img-hello-world.oss-cn-beijing.aliyuncs.com/3ef899a572d1feb04c35721f9e7fbb4a.png) -->

4.分代收集,大部分使用完后的对象都可以回收,新生代采用复制算法,年老代采用标记清除算法,回收线程可以是多个,

<!-- ![mark](https://img-hello-world.oss-cn-beijing.aliyuncs.com/bd323ded57629aa95acd49d3a5130868.png) -->
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )