JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制

①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是“根”的一个,根还包含方法中的成员变量。仅仅有成员或对象不挂在根上,GC的时候就可能把他们搞掉,这里提到的循环引用,就看这个循环引用是否挂在根上,假设挂在根上。假设这个根还被JVM的Java代码所运行的话,就不会GC掉,假设说这个根已经被释放掉了。这个对象不挂在跟上了。那个这个对象就会被GC掉。

②说一下根搜索算法,ROOTS,这个算法,那些在Java里会被觉得是根呢,在我印象里通常是static修饰的类成员,比方说静态字段,这样的字段引用的对象被称为根。仅仅要类在POOL区里不被卸载。一直在堆里,类对象仅仅要没被回收掉,他引用的对象就不会被GC。

③再说还有一种情况。方法中的栈,栈中有他的栈成员 Integer  a = XXX,当方法没有被释放。没有出栈的时候,方法没有被弹出的时候,那Integer a 所引用的对象也是不会被回收的,在什么情况下回收呢,就是这个对象没有挂在根上。就会被回收。

④我们回到标题的问题,这个循环引用是否被回收,就看这个循环引用是否挂在根上,A引用B,B引用A,A和B并没有挂在某个内存元和根上,当他们的生命周期结束的时候。这两个对象都有可能被回收。

⑥详细回收的机制,就比較复杂了。每次GC的时候。对要被回收的对象标记一次。比方说会有个计数器每次+1,+1,+1。每次GC的时候就+1一次。当对象达到默认值了。比方说好像15次吧,在新生带创建的对象达到15次了就会被达到老年带里去,而老年代对象的回收的频率和新生带回收的频率是不一样的,能够细致看下图中pool里的分区。了解他们的执行机制。

注:JVM heap分区块

Generation代

- YongGeneration/NewGeneration:新生代。在Eden/S0/S1的存活的对象。

- OldGeneration:老年代。在Tenured区存活的对象。

- PermanentGeneration:永久代。

Space 区

- Eden:伊甸园区。是新生代的一个区。

- Survivor:幸存区,属于新生代,为了复制算法的须要。一般分成大小相等的两个区(S0/S1或者From/To)。

- Tenured:存放老年代的区域。

- Permanent:终身区。

下图:Hotspot 的 Heap 分区

时间: 2024-07-31 14:21:37

JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制的相关文章

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型 的对象时检测到循环引用. 异常信息(部分): System.Web.Services.Protocols.SoapException: 服务器无法处理请求. ---> System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 序列化类型 Web

在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法

在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResult GetSdirsbyFdirid(int id) { // db.Configuration.LazyLoadingEnabled = false; db.Configuration.ProxyCreationEnabled = false; List<Seconddirectory> lis

序列化类型为&quot;xx”的对象时检测到循环引用。

错误: 序列化类型为“System.Data.Entity.DynamicProxies.PClass_F1D9DFE16F480B2B87DBB269E781139A9B4611C923176D35DD120104EDEFC17C”的对象时检测到循环引用. 背景:这是在使用MVC+EF 进行ajax post请求的时候遇到的 原因:EF  Model1和Model2进行了相互引用,就是说这两个在数据中的表有主外键关系的 解决: IList<PClass> pclassLst = PClass

序列化类型为“System.Data.Entity.DynamicProxies...&quot;对象时检测到循环引用

这是因为EF外键引起的序列化问题. 解决方案: context.Configuration.ProxyCreationEnabled = false; 这里我用的是一个基类控制器用于被继承 返回EF实例前加上这段代码就可以了 1 //用于被继承 2 public class BaseController : Controller 3 { 4 public CucuCarEntity db 5 { 6 get 7 { 8 //从当前线程中获取该对象 9 CucuCarEntity db = Cal

对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制

①首先说一下,GC里边在JVM当中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是"根"的一个,根还包括方法中的成员变量,只有成员或对象不挂在根上,GC的时候就可能把他们搞掉,这里提到的循环引用,就看这个循环引用是否挂在根上,如果挂在根上,如果这个根还被JVM的Java代码所执行的话,就不会GC掉,如果说这个根已经被释放掉了,这个对象不挂在跟上了,那个这个对象就会被GC掉. ②说一下根搜索算法,ROOTS,这个算法,那

关于EF的 序列化类型为“XXX”的对象时检测到循环引用。

在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来解决.当这个问题解决不来的时候,你可以选择下面这种方法. IQueryable<TopicInfo> topicInfos = _topicInfoService.GetPagedEntitesQueryable(pageSize, pageIndex, wherelambda, t =>

EF中Json序列化对象时检测到循环引用的解决办法

第一种方法:使用Newtonsoft.Json中的方法注释,在Json序列化的时候忽略导航属性 例:using Newtonsoft.Json; public class Users { public int Id { get; set; } public string LoginId { get; set; } public string LoginPwd { get; set; } [JsonIgnore] public virtual ICollection Roles { get; se

EF提示“序列化类型为XXX的对象时检测到循环引用”

能看到这个标题 ,我就用解释原因,网上很多,我只给大家一个解决方案会: public <#=code.Escape(entity)#> ToPOCO() { return new <#=code.Escape(entity)#>() { <# if (simpleProperties.Any()) { foreach (var edmProperty in simpleProperties) { #> <#=codeStringGenerator.Property

mvc EF框架中,加载外键对象序列化对象时报错 序列化类型为XX的对象时检测到循环引用

Newtonsoft.Json.dll 或者通过->工具->库程序包管理工具->NuGet管理包->联机 输入Newtonsoft或者json.net Newtonsoft.Json是可以的: context.Response.ContentType = "text/plain"; BooksService service = new BooksService(); List<Books> list=service.GetAll().Take(5).