本文属于原创,转载请加上链接以及博主名字
请尊重别人的劳动成果
公司开始从Windows net SQLSERVER架构系统往Linux Java MySQL 转型,这样转化完成后,公司能在技术上能有更多的积累,并且It运营成本也会大量降低。这样做后本人也从一个Net工程师转为了Java工程师。
到今天接触Java也快一年了,对于Net和Java自己心里也有一些比较,先从虚拟机的自动垃圾回收机制开始聊吧。
虚拟机类型:
Java的虚拟机比较多,接下来讨论的都是基于Hotspot为参照点
Net的,在windows环境下,也就简单了,一种选择,别无他求。
垃圾对象的判定算法:
两者对托管堆中垃圾对象的认定算法是一致的,均采用根引用算法(根搜索算法)。
简单的说,当一个对象没有被根节点所引用时,就会被认定为垃圾对象将被回收。
垃圾对象的清理算法:
分区的思路:
Net 分成三块区域: 0代,1代,2代。
Java 分成:young generation(Eden,Survivor*2),tenured generation,permanet generation
对象大小区分:
Net 认为的大对象为大于85000byte,存放在2代,LOH中。
Java是可调的,走得是PretenureSizeThreshold配置,存放在tenured space中。
垃圾回收机制:
Net:
分别为0、1、2.在CLR初始化时,会选择为三代设计不同的阈值容量,GC收集器也会运行时自动调节其阈值容量来提升执行效率。
CLR初始化后,首先被添加到托管堆中的对象都被定为第0代。当有垃圾回收执行时,未被回收的对象代龄将提升一级,变成第1代对象,而后新建的对象仍为第0代对象。代龄越小,表示对象越新,通常情况下其生命周期也越短,因此垃圾收集器总是首先收集第0代的不可达对象内存。
随着对象的不断创建,垃圾收集再次启动时则只会检查0代对象,并回收0代垃圾对象。而1代对象由于未达到预定的1代容量阈值,则不会进行垃圾挥回收操作,从而有效的提高了垃圾收集的效率,这就是代龄机制在垃圾回收中的性能优化作用。
当第0代对象释放的内存不足以创建新的对象,同时第1代对象的体积也超出了容量的阈值时,垃圾收集器将同时对0代和1代对象进行垃圾回收。之后未被回收的1代对象将升级为2代对象,未被回收的0代对象升级为1代对象,而后新建的对象依然为0代对象。
Java:
将不同生命周期的对象放在不同区域里:young generation,tenured generation和permanet generation。
绝大部分的objec被分配在young generation(生命周期短),并且大部分的会在这里释放。
当young generation满了之后,将引发minor collection(YGC)。
在minor collection后存活的object会被移动到tenured generation(生命周期比较长)。
最后,tenured generation满之后触发major collection。
major collection(Full gc)会触发整个heap的回收,包括回收young generation。
permanet generation区域比较稳定,主要存放classloader信息。
young generation有eden、2个survivor 区域组成。
其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copy collection后活着的对象的目的地。
object在survivo区域被复制直到转移到tenured区。
我们要尽量减少 Full gc 的次数(tenured generation 一般比较大,收集的时间较长,频繁的Full gc会导致应用的性能收到严重的影响
从以上几点看出,Net,Java对于垃圾回收管理,大方向的做法其实是一致的,对托管堆分区,对每个区采用不同回收阀值,控制回收次数,减少对Cpu的占用。
Net趋向于简单使用,一些阀值,每个代龄的大小,都按照经验数据做出最高性能设置,做到让使用者最简单的使用。
Java趋向于半定制型,对于各分区大小的控制,阀值的控制,回收算法的微调等等全部开放配置,提供给使用者管理。
两种不同的管理策略,各有优缺点。 然而对于一个专业使用人员更喜欢Open。
分享到:
相关推荐
垃圾回收是现代编程环境中管理内存的重要机制,它可以自动识别和清理不再使用的对象,以避免内存泄漏。 首先,CLR和JVM都采用了分代式垃圾回收策略,这是基于对象生命周期的观察:新创建的对象通常生命周期较短,而...
- **运行时环境**: 这两种虚拟机都提供了内存管理、类型安全和垃圾回收等特性。 4. **Heap-Based Classes and Garbage Collection** - **堆上分配的对象**: 在C#和Java中,所有类实例都存储在堆上,而不是栈上。...
6. **自动垃圾回收**:Java和C#都提供了自动垃圾回收功能,这意味着开发者无需手动管理内存分配和释放。 7. **单一继承与多接口实现**:Java和C#都支持单一继承以及实现多个接口。 #### Java与C#的主要差异 尽管...
CLR是.NET的核心,负责代码的编译、内存管理、异常处理和类型安全等。 2. **C#语言特性** - 介绍C#的面向对象特性,如封装、继承、多态。 - C#中的lambda表达式和 LINQ 是什么?如何使用它们进行数据查询? 3. ...
GC是垃圾回收机制,自动跟踪对象的使用情况,并在对象不再被引用时自动释放内存,避免了内存泄漏的问题。C#中的GC由CLR自动管理,程序员无需手动干预。 ### Overload与Override - **Overload**(重载)是指在同一...
在语法层面,C#借鉴了C++的一些特性,如命名空间、模板和运算符重载,同时也吸收了Java的一些简洁性,如自动垃圾回收。C#引入了匿名方法、lambda表达式和 LINQ,这些使得代码更加简洁和可读。Java8开始引入了函数式...
2. **自动内存管理**:为了简化程序员的工作并减少内存泄漏等问题,C#和JAVA都内置了自动垃圾回收机制。这种机制会在适当的时候自动释放不再使用的内存空间,使得开发人员无需手动管理内存分配和释放。 3. **取消...
- **内存管理**:自动垃圾回收,消除内存泄漏,C#允许在安全模式下使用指针。 - **封装与命名空间**:无头文件,使用包或命名空间进行组织,避免循环依赖。 - **面向对象**:所有类继承自Object,使用New关键字...
熟悉Java的基本数据类型、控制结构、异常处理和垃圾回收机制。 2. **JVM(Java虚拟机)**:了解JVM的工作原理,包括类加载、内存模型(堆、栈、方法区等)、垃圾收集器以及性能优化策略。 3. **集合框架**:掌握...
这部分可能涉及到Java与.NET平台的对比,或者对于.NET开发者来说可能遇到的Java相关问题,比如Java与C#的异同、JVM与.NET CLR的运行机制等。 再者,`java面试java面试.doc`这个名字暗示了这可能是一份深度剖析Java...
.Net框架包含Common Language Runtime (CLR),这是一个执行环境,负责代码的编译、垃圾回收和安全性管理。此外,.Net还提供了ASP.NET用于Web应用开发,WPF和WinForms则服务于桌面应用。近年来,随着.NET Core的推出...
finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。 assert是什么?什么时候用到? 答:断言,可以将断言看成是异常处理的一种高级形式,可以用来判断某个特定的表达式或值是否为真。 ...
程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:...