关于JVM个人浅谈(二)

在上一章,我们了解Java虚拟机的分布以及各个部分的主要存储内容,下面将介绍GC的长用回收算法。

1.引用计数法:

引用计数法是比较古老的一种垃圾回收算法。主要实现就是当任何一个对象引用A对象的时候,则在A对象的计数器上加1,如果引用失效的时候,则将A的计数器减1,如果对象A的引用计数器为0,则回收该对象的内存空间。这种方式虽然简单,但是存在不足,就是当A对象引用B对象,B对象又引用A对象,这样,A与B对象的计数器一直都是1,产生死锁,引起内存泄漏。

2.标记-清除法

在Java堆内存中从根节点开始遍历整个堆,标记所有可到达的对象。因此没有被标记的对象则被回收,在不连续的内存空间这样会产生大量的内存碎片。

3.复制算法

将内存划分为两个区域,每次只使用一个区域,当进行垃圾回收的时候,将正在使用的对象复制到另一块没有被使用的区域,然后清楚之前正在使用的区域所有对象,这样做的的好处是不存在内存碎片,但是需要2倍的内存空间,所有适用于新生代的回收。在新生代分为eden空间,survivor空间也叫from空间和to空间,在垃圾回收时,eden空间的存活对象会被复制到未使用的survivor空间(这里假设是to),而正在使用的survivor空间中仍然存活的对象将挪至年老代,然后eden剩下的对象将全部清楚。

4.标记-压缩算法

该算法在标记清除法上,做了一定优化,就是一样是从根节点开始遍历,找到所有可遍历到达的对象进行标记,不同的是将未标记的对象压缩到内存的一端,这样在进行回收的时候,就避免了不连续的内存空间造成的内存碎片。这种算法用于年老代的回收。

总而言之,没有一种算法能完全取代另一种算法,基本上在不同区域结合不同的算法,这样才能高效的实现垃圾回收。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 22:57:15

关于JVM个人浅谈(二)的相关文章

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

关于JVM个人浅谈(三)

在上一篇中,大致讲述了GC回收的算法,接下来就在本篇文章里介绍一下如何去预估Java对象的大小,以便后续再优化JVM提供数据理论基础. 一个普通对象的内存大小如下: 1._mark对象头 占用8byte: 2.oop指针,默认占用4byte: 3.数据区 具体根据对象属性而定: 4.padding,内存对齐(如果不懂,可以看看计算机组成原理 这本书 大学计算机系必修之一) Java以8的倍数对齐 一个普通的数组内存大小如下: 1._mark对象头 占用8byte 2.oop指针,默认占用4byt

关于JVM个人浅谈(一)

Java虚拟机是Java程序运行的基础,也是深入理解java的必备知识. 首先JVM的内存分布主要有:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区.其中标红的表示相对更重要. 1)程序计数器 程序计数器是一块很小的内存,是每一块线程的私有空间,主要负责为每一个线程记录下一条需要运行的指令.如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果电器一个线程正在执行一个Native方法,则程序计数器为空. 2)Java虚拟机栈 Java虚拟机栈是线程的私有空

jvm 原理浅谈

jvm 包含了堆栈区.方法区等存储区域.类装载子系统以及执行引擎. jvm执行流程:编译(字节码)-->类装载(加入内存)-->类执行(分配内存执行) jvm 内存机制:堆内存(new出来的所有对象)    栈内存(基础数据类型.形参.new对象的引用) 静态方法区(方法代码.final常量.静态变量) 本地方法栈 类被装载后执行前,会进行链接即初始化,初始化一些方法,先初始化默认值,然后静态初始化函数和静态域的初始化构造方法的执行!

浅谈二维线段树

一.定义 二维线段树,即用线段树维护一个矩阵 有两种实现方式: 1.原一维线段树的基础上,每一个节点都是一个线段树,代表第二维 下图是一个4*4矩阵 2.四分法转化为一维线段树 两种方法的空间复杂度都是n*n*log^2 第一种方法单次操作的时间复杂度是log^2,第二种方法最差可以退化到n 一维线段树的标记思想,在第一种方法中,可以用于二维线段树的第二维,不可以用于二维线段树的第一维 第二种方法本质上是四叉的一维线段树, 在此只介绍第一种方法 二.基本操作 1.单点修改+矩阵查询 单次访问一个

浅谈二维线段树的几种不同的写法

目录 参考文献 参考文献 暴力写法 二叉树 四叉树 树套树写法1 参考文献 四叉树 树套树 以及和zhoufangyuan巨佬的激烈♂讨论 参考文献 大家好我口糊大师又回来了. 给你一个\(n*n\)矩阵,然后让你支持两种操作,对子矩阵加值和对子矩阵查和. 暴力写法 对于每一行开一个线段树,然后跑,时间复杂度\(n^2logn\). 优点: 代码较短 较为灵活 缺点: 常数大 容易卡 二叉树 我们对于平面如此处理,一层维护横切,一层竖切. 当然,这个做法也是\(n^2logn\)的,卡法就是任意

关于自动化学习浅谈二

什么是自动化测试?自动化测试的原理是什么?常用哪些工具?常用哪些框架?工具的原理又是什么?自动化如何学习?自动化的优点与缺点是什么?价值在哪里?学习自动化测试要了解与掌握哪些内容?哪些项目适合自动化测试呢? 想学习自动化测试首先得明白以上一些问题,不然学着只能知其然,不知其所以然. 1,什么是自动化测试?优缺点是什么?价值在哪里? 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程. 从它的定义中是不是所有人为驱动的测试都可以转化为机器执行呢? 答案是否定的.这也就带出了自动化的局限性.

Servlet浅谈(二)

1.forward(请求的转发)和redirect(重定向) 目的:都是为了把一个Servlet的功能,拆分到多个Servlet中,便于后续代码的维护. a.forward(请求转发) (1).如何在多个Servlet之间跳转 request.getRequestDispatcher("/url-pattern").forward(request,response). ps.路径只用填写web.xml中配置的sevlet路径即可 (2).request作用域传递数据 存数据: requ

salesforce lightning零基础学习(九) Aura Js 浅谈二: Event篇

上一篇介绍了Aura Framework中 Component类的部分方法,本篇将要介绍Event常用的方法. 1. setParam (String key , Object value):设置事件的param,此项设置不会修改已经被触发的事件.我们在创建事件的时候可以同时声明attribute,在我们fire事件以前,可以对这些attribute设置值,其中key为attribute的name,value部分即为attribute的value. 2.setParams (Object con