黑马程序员技术交流社区
标题: 【阳哥专栏】技术分活动第9期 [打印本页]
作者: 王震阳老师 时间: 2014-8-8 22:19
标题: 【阳哥专栏】技术分活动第9期
本帖最后由 就业指导-王震阳老师 于 2014-8-18 11:07 编辑
声明:以后的技术分活动中的技术题,越来越偏向于数据结构、算法、JVM、多线程、高并发等,因此对于基础的要求也是更高的。
活动目的:练习javaSE知识,学习JVM知识。
活动奖励:最高2个技术分
结束时间:2014年8月11日,过期提交可能获取不到技术分!
代码提交要求:将自己的源代码压缩然后提交,提交的时候设置为管理员权限,以其他方式提交的答案无效。上交源码的时候不需要将整个工程项目压缩,只需将用到的源文件压缩即可。
题目类型:JavaSE JVM垃圾回收算法。
难易程度:容易
题目:老规矩,回帖领题
更多技术分活动:
【阳哥专栏】技术分活动第12期
http://bbs.itheima.com/thread-138162-1-1.html
【阳哥专栏】技术分活动第11期
http://bbs.itheima.com/thread-137632-1-1.html
【阳哥专栏】技术分活动第10期
http://bbs.itheima.com/thread-136866-1-1.html
【阳哥专栏】技术分活动第9期
http://bbs.itheima.com/thread-136465-1-1.html
【阳哥专栏】技术分活动第8期
http://bbs.itheima.com/thread-135781-1-1.html
【阳哥专栏】技术分活动第7期
http://bbs.itheima.com/thread-134321-1-1.html
【阳哥专栏】周末技术分活动第6期
http://bbs.itheima.com/thread-132893-1-1.html
【阳哥专栏】周末技术分活动第5期
http://bbs.itheima.com/thread-129859-1-1.html
【阳哥专栏】周末技术分活动第4期
http://bbs.itheima.com/thread-128854-1-1.html
【阳哥专栏】周末技术分活动第3期
http://bbs.itheima.com/thread-127326-1-1.html
【阳哥专栏】周末技术分活动第2期
http://bbs.itheima.com/thread-125800-1-1.html
【阳哥专栏】周末技术分派送活动第1期
http://bbs.itheima.com/thread-123979-1-1.html
作者: 萍水相逢 时间: 2014-8-8 22:21
看看这次的题是什么样的
作者: huoshao008 时间: 2014-8-8 23:16
回帖领题.
作者: yqj 时间: 2014-8-8 23:27
看看题目
作者: 小A 时间: 2014-8-8 23:42
我来看看题
作者: 阿温 时间: 2014-8-9 00:38
这道题好高端的样子,看看
作者: 李彦来 时间: 2014-8-9 07:22
拿来看看
作者: ddewym123 时间: 2014-8-9 08:40
本帖最后由 ddewym123 于 2014-8-10 20:55 编辑
请查收!
-
-
GC机制.rar
680.21 KB, 阅读权限: 200, 下载次数: 1
作者: 心者觉也 时间: 2014-8-9 08:55
来看题
作者: w26400481 时间: 2014-8-9 08:56
来看看题
作者: 尘埃落定 时间: 2014-8-9 09:04
看看题先。。。
作者: 菜鸟一号 时间: 2014-8-9 09:25
来看看题先。。。
作者: 曲佳奇 时间: 2014-8-9 09:32
看看....
作者: justin1258 时间: 2014-8-9 09:40
阳哥威武,第三次来领题~~
作者: tonglingwang 时间: 2014-8-9 09:46
我又来领题啦,学习下
作者: 王石 时间: 2014-8-9 10:45
看看题目
作者: 逸晨 时间: 2014-8-9 11:03
看看题目
作者: 魏诚东 时间: 2014-8-9 11:07
领题~~~~~
作者: 王石 时间: 2014-8-9 11:15
此题不会,是真心gc的算法,我只知道gc是运行垃圾回收器
作者: 马超(Andy) 时间: 2014-8-9 11:26
看看题:hug:
作者: 沟门大杏 时间: 2014-8-9 12:10
再来一个
作者: 沟门大杏 时间: 2014-8-9 12:22
阳哥看看行不行
-
-
JVM垃圾回收(GC)原理123.rar
21.04 KB, 阅读权限: 200, 下载次数: 1
作者: 小A 时间: 2014-8-9 12:58
求阳哥指点
-
-
JVM的GC机制以及GC算法.rar
129.53 KB, 阅读权限: 200, 下载次数: 1
作者: 申航航 时间: 2014-8-9 14:18
过来看看题目
作者: 唕 时间: 2014-8-9 14:39
路过
作者: shijianws 时间: 2014-8-9 14:40
看看题目
作者: relive 时间: 2014-8-9 15:28
领题试炼
作者: chen010yu 时间: 2014-8-9 15:35
路过进来看看
作者: wangyang 时间: 2014-8-9 15:40
回帖领题
作者: 晏敏 时间: 2014-8-9 16:01
领题看看
作者: 教皇 时间: 2014-8-9 18:06
看看。。
作者: wangyang 时间: 2014-8-9 19:01
请阳哥审查
-
-
JVM的内存结构和GC机制.zip
15.12 KB, 阅读权限: 150, 下载次数: 2
技术分活动第9期
作者: yueyouqiang 时间: 2014-8-9 19:19
还是看看题,
作者: 叼哥 时间: 2014-8-9 19:35
又来领题了
作者: 喜爱 时间: 2014-8-9 20:38
来领题了啊。。。。。
作者: 左脑想你 时间: 2014-8-9 21:05
什么题呀
作者: 13155155528 时间: 2014-8-9 21:05
看看题目先
作者: gyw520gyw 时间: 2014-8-9 21:09
您的帖子长度不符合要求。 当前长度: 2 字节 系统限制: 10 到 10000 字节
作者: More 时间: 2014-8-9 21:10
垃圾回收机制。。
作者: 李利威 时间: 2014-8-9 21:27
我来试试!!!
作者: Franklin 时间: 2014-8-9 21:46
看看自己的水平
作者: 萍水相逢 时间: 2014-8-9 21:58
感觉这道题,挺高大上的!自己在网上查查了查,算是学习了吧
-
-
JVM的GC机制.zip
9.46 KB, 阅读权限: 200, 下载次数: 1
作者: sugar 时间: 2014-8-9 21:59
来领题目
作者: 这个夏天的芬芳 时间: 2014-8-9 22:25
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: Hello_U 时间: 2014-8-9 22:59
这次有时间
作者: 执笔梦 时间: 2014-8-9 23:24
学习下...
作者: bbdeyouxang 时间: 2014-8-10 08:48
回帖看题
作者: Anyway 时间: 2014-8-10 10:33
领题,谢谢
作者: 程序媛师妹 时间: 2014-8-10 10:54
领题看看
作者: 程序媛师妹 时间: 2014-8-10 11:28
本帖最后由 程序媛师妹 于 2014-8-10 12:10 编辑
简单了解学习了一下
-
-
对JVM的GC的了解.zip
3.79 KB, 阅读权限: 100, 下载次数: 1
作者: 赵权 时间: 2014-8-10 13:40
我要做题
作者: FnSean 时间: 2014-8-10 15:16
看一看,学习学习
作者: aaa99992 时间: 2014-8-10 15:58
虽然不用,但还是支持了!!...
作者: Fengs 时间: 2014-8-10 16:27
感受一下来!
作者: sing 时间: 2014-8-10 17:05
看看题目
作者: 喜爱 时间: 2014-8-10 18:13
有学习到一些新东西,一点一点积累!:)
-
-
GC收集器.zip
1.68 KB, 阅读权限: 100, 下载次数: 1
作者: gmz158 时间: 2014-8-10 20:42
看看题
作者: Vista 时间: 2014-8-10 21:01
回帖领题:lol
作者: gmz158 时间: 2014-8-10 21:26
有木有分
-
-
GC机制及常用GC算法.zip
5.04 KB, 下载次数: 236
作者: WakeUp 时间: 2014-8-10 21:49
我要领题~~{:3_57:}
作者: 逸晨 时间: 2014-8-10 22:39
请查收。
-
-
JVM的GC机制.zip
98.2 KB, 阅读权限: 200, 下载次数: 1
作者: ZHOU_XIAO_BING 时间: 2014-8-10 23:19
我是来领题目的
作者: ZHOU_XIAO_BING 时间: 2014-8-10 23:28
不懂啊 看来拿不到技术分了
作者: relive 时间: 2014-8-11 01:21
烦请查收,relive原创手打!
java GC.rar
(107.07 KB, 下载次数: 290)
作者: java_668 时间: 2014-8-11 08:55
来看一下子
作者: 王震阳老师 时间: 2014-8-11 11:51
挺好:
- GC(Garbage Collection) 垃圾收集
- 在堆中,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象有哪些还“存活”着,哪些已经“死去”
- 1、引用计数算法:
- 给对象中添加一个引用计算器,每当有一个地方引用它时,计算器值就加1;当引用失效时,计数器就减1;
- 任何时刻计数器都为0的对象就是不可能再被使用的。
- 这种算法判断效率很高,但是在Java却没有使用种进行管理内容,其中最主要的原因是它很难解决对象之间的
- 相互循环引用的问题。
- 简单的例子:
-
- public class ReferenceCountingGC {
- public Object instance = null;
- private static final int _1MB = 1024 * 1024;
- private byte[] bigSize = new byte[2 * _1MB];
- punlic static void testGC(){
- ReferenceCountingGC objA = new ReferenceCountingGC();
- ReferenceCountingGC objB = new ReferenceCountingGC();
- objA.instance = objB;
- objB.instance = objA;
-
- objA = null;
- objB = null;
-
- System.gc();
- }
-
- public static void main(String[] orgs){
- ReferenceCountingGC.testGC();
- }
- }
- objA.instance = objB,objB.instance = objA,除此之外,这两个对象再无任何的引用,实际上这两个对象已经不可能
- 再被访问,但是它们因为互相引用着对方,导致它们的引用计书都不为0,于是引用计数算法无法通知GC收集器回收它们。
- 2、标记 - 清除算法
- 分为两个阶段:
- 首先标记所有需要回收的对象,
- 在标记完成后统一回收掉所有被标记的对象。
- 该算法有两个缺点:
- 一个是效率问题,标记和清除过程的效率都不高。
- 另外一个是空间问题,标记清除之后产生大量不连续的内存碎片,空间碎片大多可能导致,当程序在以后的远行
- 过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
- 3、复制算法:
- 将可用内存按内量划分为大小相等的两块,每一次只使用其中一块。当这一块内存用完了,就将还存活着的对象复制
- 到另外一块上面,然后再把已使用过的内存空间一次清理掉。
- 现在的商业虚拟机都用这种算法来回收新生代,将内存分为一块较大的Eden空间和两块较小的Survivo空间。每次使用
- Eden和其中的一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地拷贝到另外一块Survivor空间上,
- 最后清理掉Eden获取刚才用过的Survivor的空间。
- 缺点:默认情况下Eden:Survivor=8:1, 所以总会有100-(80+10)%的新生代内存会被浪费掉。
-
- 4、标记 - 整理算法(适用于存放生命周期较长对象的)
- 标记过程与“标记 - 清楚”算法一样,但是继步骤不是直接对可回收对象进行清理,而是让
- 所有存活的对象都向一段移动,然后直接清理掉端边界以外的内存。
-
复制代码
作者: 王震阳老师 时间: 2014-8-11 11:53
挺好:
作者: 王震阳老师 时间: 2014-8-11 11:54
很给力:
Java GC
---- relive
1.Jvm内存结构
java虚拟机在解析执行java程序的时候会把其管理的内存主要分配成5块数据区域。
1.程序计数器
i.占用较小内存空间,可看作是当前线程所执行的字节码的行号指示器(学过汇编语言的同学应该了解);
ii.工作原理类似通过改变计数器的值来选取下一条执行的指令的字节码;
iii.线程私有:即为了让各个线程之间的计数器互不影响,独立存储,所以每条线程都需要一个独立的程序计数器,不能共享,否则易造成数据不一致;
2.java虚拟机栈
i.俗称栈区,描述java方法执行的内存模型,即每个方法在执行时都会创建一个栈帧用于存放变量、局部变量表、操作数栈、动态链接、方法出口等信息,一个方法从调用至完成,对应着一个栈帧在虚拟机中的出入栈过程;
ii.线程私有,与线程的生命周期一致;
3.本地方法栈
i.和java虚拟机栈类似,二者的区别即java虚拟机栈存放的对象是java中的字节码,而本地方法栈存放的对象是本地方法,例如c/c++写的程序等;
ii.线程私有,生命周期与线程一致;
4.堆区
i.java虚拟机管理的内存中最大的一块,也是线程共享的内存区;
ii.其作用主要是存放对象实例,java虚拟机规范中声明“所有的对象实例以及数组都需要在对上分配内存。”;
iii.Java GC的主要区域,jvm基本采用分代手机算法,可以把堆区细分为新生代和老年代;
5.方法区
i.线程共享;
ii.用于存放已经被虚拟机加载的类信息、常量、运行时常量、静态变量、即时编译器编译后的代码等;
iii.又叫做non-heap;
2.Java GC机制
i.GC面临的问题
i.什么样的对象会被回收?
参看“什么样的对象会被回收”
2.何时回收?
有jvm决定,对程序、程序员透明,何时回收不可预知;
iii.怎么回收?
参看“c,d,e,f,g”
b.什么样的对象将会被回收
当一个对象在对内存中完成初始化之后,其所经历的状态有三种,其中,当对象的状态变为不可达之后,将会被java GC回收内存资源。
i.可达状态:存在直接引用,例如Object oo = new Object();
ii.可恢复状态:如果不再有任何引用,则进入可恢复状态,在GC回收内存前,会调用其finalize方法来清理资源,例如oo=null;
iii.不可达状态:不再有任何引用,且调用其finalize方法后对象没有变成回达状体,则该对象将会永久的失去引用,变成不可达状态,将会真正的被GC回收内存资源;
iii.强制垃圾回收
当一个对象失去引用后,会进入可恢复状态,此时如果调用其finalize方法没有使其重回可达状态,则该对象会永久失去引用等待java GC回收内存,系统什么时候回收内存,对程序、程序员是透明的,由jvm来选择何时进行回收;但是程序中可以调用以下两种方式来进行强制内存回收,但是这种“强制”对jvm来说其实是一种“建议”,即便是写了轻质回收的代码,jvm也不一定会立即回收内存资源。
i.System.gc();
ii.Runtime.getRuntime().gc();
iii.例证
1.Java_bin
2.
3.Main
iv.执行结果
5.结论
程序new了10个无引用的匿名对象,每new一个无引用的对象都会“强制”系统回收内存,但是从程序多次执行的表现观察,调用finalize方法的次数基本上每次都不相同而且不一定等于10次或0次,所以得出结论:java强制回收不是真的强制,而是对jvm的一种“建议”,“建议”其现在进行GC操作,但是jvm什么时候真正开始回收内存,对程序、程序员而言是透明的,不可预测。
d.finalize方法
i.解释:finalize方法源自Object中,protected修饰,即允许其被子类继承、重写;在java真正执行GC回收一个对象占用的内存之前会调用该方法来清理资源,如果在该方法中,对象没有变变回达状态,则finalize方法执行完成返回后对象消失,垃圾回收开始真正执行;
ii.建议:程序员不要主动调用对象的finalize方法,应该交由垃圾回收机制来调用;
iii.备注:finalize方法何时被调用、是否被调用具有不确定性;当jvm首先执行finalize的时候,有可能使对象重可恢复状态变成可达状态,从而不被GC掉;当JVM执行finalize方法的时候出现异常,垃圾回收机制不会报告一场,程序继续运行,但是finalize异常之后的代码不会继续执行(如下,修改Main.class的finalize方法,使其抛出异常,再重新执行Main.java文件的时候,并无任何异常抛出,但是再也不会输出System.out的字符);
e.java中的引用
i.强引用:对象有一个及其以上的引用,例如Object oo = new Object();
ii.软引用:java中通过SoftReference类来实现引用级别低于强引用,当系统内存足够时,起不会被系统回收;当系统内存不够使,其可能被回收;
iii.弱引用:通过WeakReference类实现,引用级别低于软引用,无论系统内存是否足够,系统进行垃圾回收的时候总是会回收其占用的内存;
iv.虚引用:通过PhantomReference类实现,引用级别最低,类似没有引用,主要用于跟踪对象被垃圾回收的状态;
v.用法示例:
String str = new String("我是xx");
WeakReference wr = new WeakReference(str);
//软引用和虚引用类似
f.常用对象判死算法
i.引用计数法
通过引用计数器来判断对象是否被引用,例如有一个引用则引用计数器+1。
a.缺点:对象的相互引用会导致无法回收内存;
b.代码:
Java_bin_a:
Java_bin_b:
c.图示:
ii.可达性分析
类似树状结构,从“GC Root”节点开始通过引用链搜索,如果一个对象无路可达,则表示该对象处于可恢复状态,等待被GC回收内存资源;
g.垃圾收集算法
i.标记-清除
先标记“不可达”状态的对象,然后统一回收内存资源;效率不高,同时会导致内存碎片化;
b.复制算法
为了提高“标记-清楚”算法的效率,将可用内存划分成大小相等的两块,每次只是用其中的一块,当这一块内存用完了(包含存活对象、等待回收的对象和碎片占用的空间),则一次性拷贝到另一块,此时将会释放等待回收对象的内存空间,同时解决内存碎片问题,存活对象连续占用一片内存,再一次性清空原先的内存块;
iii.标记-整理
相比较“复制算法”,不会浪费50%的内存,算法不直接回收不可达对象占用的内存,而是让存活对象都向一端移动,然后清理释放边界的内存空间;
iv.分代收集
根据对象的存活周期在堆中将对象分为新生代和老年代,根据不同代特点不同选择不同的算法:
新生代——绝大部分对象很快不可达需要回收内存,采用复制算法,每次只需要付出极少的复制代价;
老年代——绝大部分对象长期保持可达状态,适合采用“标记-清理”或“标记-整理”算法;
3.其他
a.随着操作系统的发展,32bit系统必然会逐渐被64bit系统取代。虽然java虚拟机在很早以前就已经推出了64bit的版本,但是直到目前,任旧存在问题——java程序跑在64bit系统上系能消耗比32bit系统的多,多消耗20%左右内存,存在10%左右的性能差距;
b.首先要注意,java GC只针对内存的回收,对类似数据库连接、io等物力资源的释放不会自动回收,均需要手动close掉;
c.程序员无法精确的控制何时回收内存,只能给jvm提供“建议”或在代码上做一定的优化;
作者: 小糊涂神 时间: 2014-8-11 12:35
看看什么题
作者: relive 时间: 2014-8-11 13:21
oneNote写的,格式转码过程中出问题,我重新发出来吧~
作者: 王震阳老师 时间: 2014-8-11 14:10
你自己直接公布出来吧,还能排版,你里面的图片我无法排版。
作者: bbdeyouxang 时间: 2014-8-11 16:07
总结的不好,请阳哥指正。
-
-
JVM内存结构、垃圾回收机制以及GC基本算法知识点总结.zip
3.49 KB, 阅读权限: 200, 下载次数: 1
作者: 姠佐メ亾佑つ 时间: 2014-8-12 00:33
我来看题目的
作者: 呀嘛咕 时间: 2014-8-12 17:52
我要领题,嘿嘿嘿
作者: Justfeeling 时间: 2014-8-12 21:45
火火火火火,顶起!!!!!!!!!!!!!!!!
作者: skyfly 时间: 2014-8-12 22:05
看题 做做
作者: 常乃伟 时间: 2014-8-14 00:32
只是来看题目的!!!!!!
作者: 孙小亚 时间: 2014-8-14 11:30
来学习!
作者: toselect 时间: 2014-8-14 13:12
回帖领题。
作者: 冒牌高手 时间: 2014-8-14 15:09
看一下会不会打额呢
作者: 张亚军 时间: 2014-8-16 00:39
这么好的技术条件。。。。。。。。
作者: 会飞De石头 时间: 2014-8-18 12:37
看看这个题目。。。
作者: xiong910627 时间: 2014-8-18 13:51
黑马程序员,我来领题!
作者: Huberry 时间: 2014-8-18 20:25
领题 ~~~
作者: 潘多拉 时间: 2014-8-19 14:32
继续领题啊啊啊
作者: 潘多拉 时间: 2014-8-19 14:34
继续领题啊啊啊
作者: happymouse 时间: 2014-8-19 15:27
看看题目
作者: shuimu_88 时间: 2014-8-19 19:54
看看题目
作者: LoveJava8 时间: 2014-8-19 22:38
我要领题
作者: @for 时间: 2014-8-21 16:42
看题。。。。。。。。。。。。。
作者: 咸菜+萝卜干 时间: 2014-8-21 21:13
抢地主{:3_47:}
作者: cat73 时间: 2014-8-22 01:20
看看题目- -.........................
作者: 孙雯 时间: 2014-8-22 17:12
领题观摩观摩,学习学习O(∩_∩)O~
作者: 无奈的年华ˊ 时间: 2014-8-23 01:21
看题
作者: Baiye 时间: 2014-8-23 20:06
先来看题
作者: 大山 时间: 2014-8-24 00:01
看一下多学点知识
作者: java_dream 时间: 2014-8-24 00:05
领题拿技术分
作者: 依然超级赛亚人 时间: 2014-8-24 07:14
本帖最后由 依然超级赛亚人 于 2014-8-24 07:15 编辑
老规矩,回帖领题,阳哥辛苦。
作者: yingsun 时间: 2014-9-2 03:03
这次能看到什么呢?
作者: Mokill0911 时间: 2014-9-2 06:09
回帖领题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |