日常小记
1、每个线程有一个栈空间;在线程里调用一个方法时,就会启动一个栈帧;每一个栈帧里面都保存这个方法所用到的局部变量。
**********
2、方法区,用于存放class信息、静态变量、字符串常量常量池。
**********
3、
1)JVM中共享数据空间可以分成三个大区,新生代(Young Generation)、老年代(Old Generation)、永久代(Permanent Generation),其中JVM堆分为新生代和老年代。
2)新生代可以划分为三个区,Eden区(存放新生对象),两个幸存区(From Survivor和To Survivor)(存放每次垃圾回收后存活的对象)。
3)当第一次new出一个对象的时候,若是特别大的对象,直接放在老年代;其他的普通对象,直接放在新生代。
原来的JVM垃圾回收机制(复制算法,将内存平均分成A、B两块)内存代价高,有效内存为占用内存的一半。改进后的复制算法,使用Eden/S0/S1三个分区,Eden:S0:S1==8:1:1,有效内存(即可分配新生对象的内存)是总内存的9/10。
算法过程:
1. Eden+S0可分配新生对象;
2. 对Eden+S0进行垃圾收集,存活对象复制到S1。清理Eden+S0。一次新生代GC结束。
3. Eden+S1可分配新生对象;
4. 对Eden+S1进行垃圾收集,存活对象复制到S0。清理Eden+S1。二次新生代GC结束。
5. goto 1。
当一个对象在S0/S1中达到设置的XX:MaxTenuringThreshold值后,会将其分到老年代中。(即经过多次垃圾回收后,survivor中一直存在某个变量,就把这个变量放进老年代中去)
**********
4、垃圾:没有引用指向的对象 + 循环引用的对象 + 环形引用(A->b->c->A)
强引用:String str = new String();只要引用存在,垃圾回收器永远不会回收。
软引用:用来描述一些还有用但并非必须的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之内进行的第二次回收。
弱引用:被弱引用关联的对象只能存活到下一次垃圾回收之前。(主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾)
虚引用:一个对象是否有虚引用的存在,完全不对其生存时间造成影响。为一个对象设置虚引用关联关系的唯一目的就是在这个对象被垃圾回收器回收时收到一个系统通知。