- 博客(6)
- 收藏
- 关注
原创 垃圾收集器
java虚拟机规范中对垃圾收集器没有做出要求,因此不同的厂商,不同版本的虚拟机的垃圾收集器可能会有很大的不同,我们一般根据垃圾收集器的特点进行组合使用来达到更好的效果。Serial收集器最基本,历史最悠久的收集器。单线程收集器,单线程的意思是说:在这个收集器工作时,需要“stop the world”关闭其它所有的线程,用户体验不好。但是跟随技术的发展,停顿时间在一百毫秒之内。只要不是频繁发生垃圾...
2018-03-05 18:08:31
129
原创 内存分配与回收策略
对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,按线程优先在TLAB上分配。少数情况下也可能直接分配在老年代中。分配的规则不是确定的,其有关收集器组合和参数设置。对象优先在Eden分配大多数情况下,对象优先在Eden分配,当Eden没有足够的空间时,虚拟机会发起一次Minor GC。Minor GC : 新生代GC;发生在新生代的垃圾收集动作;Minor GC 非常频繁,回收速度也...
2018-02-09 16:21:31
140
原创 垃圾收集算法思想及其发展过程
垃圾收集算法标记-清除算法标记-清除算法是最基础的收集算法,这么说的原因是后面所有的收集算法都是基于这个算法的思路并对其缺点进行改进而来的。算法的思路主要分为两个阶段,先判断对象是否存活(见上一篇博客),若不存活,标记。完了之后统一清除。缺点:效率低,标记和清除的效率都不高。容易产生空间碎片,如果这时出现一个比较大的对象,不得不提前触发第二次垃圾回收。复制算法实现思路:
2018-02-07 17:12:51
173
原创 垃圾收集器与内存分配策略(判断对象是否存活)
程序计数器,虚拟机栈,本地方法栈,这三个区域随着线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而入栈和出栈。每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的。因为这几个区域垃圾回收具备确定性,方法结束或线程结束运行,内存自然会跟着回收了,而堆和方法区则不一样,因为无法确定一个接口的实现类它到底占用多少内存,一个方法中的多个分支需要的内存可能也不一样,只有在程序运行期间才能知道会创建哪
2018-02-07 17:12:37
167
原创 java内存区域与内存溢出异常(对象访问)
java中,对象访问是如何进行的?即使是最简单的对象访问,也一定会涉及方法区,堆,虚拟机栈这三个数据区域。以 Object obj = new Object(); 为例Object obj 这部分的语义会反映到java栈的本地变量表中,作为一个reference类型的数据出现。new Object() 这部分的语义会反映到java堆,形成一块存储了Object类型所有实例数据值的结构化
2018-02-07 17:12:20
174
原创 java内存区域与内存溢出异常(运行时数据区域)
运行时数据区域java虚拟机会在运行时将它所管理的内存划分为若干个不同的数据区域。其中堆和方法区所有线程共享。虚拟机栈、程序计数器、本地方法栈线程隔离。1.程序计数器程序计数器的作用可以看作是当前线程所执行的字节码的行号指示器。jvm的多线程实现事实上是通过线程快速轮流切换并分配处理器执行时间。在某一时刻,某一个处理器(多核处理器除外)只会执行一个线程中的指令。因为,分配的cpu执行时
2018-02-07 17:11:59
235
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅