JAVA垃圾回收期老年代和新生代是什么意思?
是“垃圾回收器”吧,就是Java虚拟机内存清理,使用一段时间后内存中会产生大量永远不再使用的对象,如果不清理掉,消耗的内存会越来越大。至于什么时候会执行清理的动作、什么样的内存会成为清理的目标可以另外查资料学些。
老年代和新生代也是和内存相关,虚拟机初始化时已经设定了使用的内存大小,并划分为三部分:
新生代– 新创建的对象,旧生代 – 经过多次垃圾回收没有被回收的对象或者大对象持久代– JVM使用的内存,包含类信息等
java中什么是null的对象?
一、null是代表不确定的对象
Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。
比如:int a = null;是错误的。Ojbect o = null是正确的。
二、null本身不是对象,也不是Objcet的实例
null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
三、Java默认给变量赋值
在定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。
这个具体可以通过调试来看。
四、容器类型与null
List:允许重复元素,可以加入任意多个null。
Set:不允许重复元素,最多可以加入一个null。
Map:Map的key最多可以加入一个null,value字段没有限制。
数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。
五、null的其他作用
1、判断一个引用类型数据是否null。 用==来判断。
2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。
Spring管理单例对象的时候,如何实现不被JVM回收的?
这个问题肯定要分为JVM对象回收和Spring对象管理来说的!如果看完还不会,你尽管来抽我。。
一,JVM对象回收:
就是对没有引用存在的对象进行回收,最原始的做法是加一个对象引用计数器,比如A被B引用了,则A对象的引用计数器为1,只要B没被回收,A的引用计数大于0,A就不会被回收!
但是这样做是有隐患的,如果A引用B,B引用A,然后没有任何其他对象引用A,B的时候,理论上AB都应该被回收了,但是AB引用计数器上面的计数都为1,不能回收,这样两个永远不会使用但也无法回收的对象占据着内存,直到内存溢出!
JVM是怎么解决这一现象的呢?引入一个GCRoots(引用链)的东西,把静态对象引用,常量引用等作为根节点,其余所有的引用都挂在这棵引用树上,上面说到的AB,如果从根节点上遍历的时候没有找到AB的引用(不可达根节点),就说明AB已经脱离了引用链,就算引用计数器还为1,也将被回收!
二,spring管理对象:
首先我们要知道spring通过IOC控制反转帮助开发者管理对象,在spring容器启动的时候加载类(所有实现了BeanFactory的类),然后实例化对象(这儿不讨论是否懒加载等),最后进行使用!
如下图,就是创建对象的父接口:
先看SimpleJndiBeanFactory类:
在SimpleJndiBeanFactory类中,先new了一个名叫singletonObjects的final修饰的hashmap变量,在容器启动的时候,通过doGetSingleton方法把jndi反射得到的实例化对象放入此hashMap中,作为new出来的强引用,没有进行释放就会一直挂在引用链上,不会进行释放!
再看看ApplicationContext下面的StaticListableBeanFactory类,使用new出来的名为beans的LinkedHashMap进行管理,同时使用addBean方法加入对象到map中,方便及时调用!
综上,spring管理的对象,都通过map等形式加载,挂在了引用链上,所以并不会一不使用就被回收了!
顺便说下,spring这种"家喻户晓"的框架,其实底层也就是JAVA基本的数据结构组成的,所以JAVA程序员人人都可以编一个spring框架出来!更多的技术分享,敬请关注。。。