java进程阀值,Java基础_线程和进程概念、 jvm垃圾回收机制

背景

简单介绍一下线程和进程概念与java的jvm垃圾回收机制

线程和进程概念

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216 ,而 32 位处理机的进程空间大小为 232 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。进程是指在系统中正在运行的一个应用程序

线程:线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。

JVM垃圾回收机制

JVM怎么确定哪些空间会被回收

引用计算法:

简单的来说就是判断对象的引用数量。实现方式:给对象共添加一个引用计数器,每当有引用对他进行引用时,计数器的值就加1,当引用失效,也就是不在执行此对象是,他的计数器的值就减1,若某一个对象的计数器的值为0,那么表示这个对象没有人对他进行引用,也就是意味着是一个失效的垃圾对象,就会被gc(Generational Collection)进行回收。

但是这种简单的算法在当前的jvm中并没有采用,原因是他并不能解决对象之间循环引用的问题。

假设有A和B两个对象之间互相引用,也就是说A对象中的一个属性是B,B中的一个属性时A,这种情况下由于他们的相互引用,从而是垃圾回收机制无法识别。

可达性分析算法:

因为引用计数法的缺点有引入了可达性分析算法,通过判断对象的引用链是否可达来决定对象是否可以被回收。可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连(就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。

怎样清除垃圾的

主要通过这几种算法:

复制算法(新生代使用)将内存分为两块,当使用一块存满了就将存活的对象复制到另一块中,再将使用的另外一块清空。内存会小于原来的二分之一。

标记-清除算法(一般老生代使用)需要先标记所有需要回收的对象,然后清除标记的对象。但是会产生空间碎片,造成资源浪费。

标记-整理算法(一般老生代使用)需要先标记所有需要回收的对象,然后清除标记的对象,再将剩下的存活对象整理,避免空间碎片的产生

分代收集算法,就是平时我们总说的gc。分代收集算法是比较智能的垃圾回收算法,也是现代JVM使用最多的算法,他本身并不是一种算法,而是在具体的场景上选择上面三种方法进行垃圾回收。代(新生代、老年代、永久代),新生代一般使用复制算法,老生代一般使用标记-整理算法,元空间(过阀值就收集)

新生代与老年代的转换

新生代对象分为三个区域: Eden (一蹬)区和两个Survivor区分为from区和to区。新创建的对象都放在Eden区,当Eden区的内存达到阈值之后会触发Minor GC,这时会将存活的对象复制到一个Survivor区中,这些存活对象的生命存活计数会加一。这时Eden区会闲置,当再一次达到阈值触发Minor GC时,会将Eden区和之前一个Survivor区中存活的对象复制到另一个Survivor区中,采用的是我之前提到的复制算法,同时它们的生命存活计数也会加一。这个过程会持续很多遍,直到对象的存活计数达到一定的阈值后会触发一个叫做晋升的现象:新生代的这个对象会被放置到老年代中。老年代中的对象都是经过多次GC依然存活的生命周期很长的Java对象。当老年代的内存达到阈值后会触发Major GC,采用的是标记整理算法。

45549305e195

新生代与老年代转换.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值