上文简单介绍了JVM的一些原理作为铺垫,接下来介绍一下垃圾回收。 java的垃圾回收机制,主要采用的是分代回收机制。 分为: 1)新生代:新出生的对象在这里创建,又分为一个eden(伊甸园,这个名字很贴切),两个s...
分类:
其他好文 时间:
2015-08-10 08:17:43
阅读次数:
152
关于JVM调优,有哪些梗值得去学习呢? 对于一样事物,我总会问自己几个问题: 1)它是什么,包括什么内容? 2)它作什么用?解决什么问题? 一、是什么? JVM是解析和运行.class二进制文件的东西。 包括好几部分:...
分类:
其他好文 时间:
2015-08-09 20:54:11
阅读次数:
129
我们经常说的垃圾收集(Grabage Collection,GC)需要确定以下三个事情:哪些内存需要回收?
什么时候回收?
如何回收?
在这三件事情之前,我们先看看为什么要进行垃圾收集?
因为程序中存在的实例对象,变量等信息如果不进行垃圾回收的话,随着程序的运行,必然会带来程序性能的下降,造成卡、慢甚至系统异常。
哪些内存需要回收?
前面我们说到了程序计数器、虚拟机栈、本地方法栈三个区域是线程隔离...
分类:
其他好文 时间:
2015-08-06 02:05:25
阅读次数:
192
1、标记清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。缺点是效率问题和产生大量不连续的内存碎片,导致程序后期需要分配大对象时无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。
2、复制算法:将可用内存划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。
3、标记整理...
分类:
编程语言 时间:
2015-07-31 22:04:39
阅读次数:
170
Java内存管理是面试中经常会问到的问题。Java的内存管理其实是指对象 的分配和释放问题。曾经看过这样一句话:“C++程序员觉得内存管理太重要了,所以一定要自己进行管理,而Java程序员觉得内存管理太重要了,一定不能自己管理”。我觉得这句话说得太精辟了。
C++程序员需要显式分配内存,释放内存,而这样常常会引起“内存泄露”。而Java程序员不需要显式分配和释放内存,Java在创建对...
分类:
编程语言 时间:
2015-07-31 01:27:04
阅读次数:
143
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对...
分类:
其他好文 时间:
2015-07-30 13:05:29
阅读次数:
141
截止现今版本,Java的引用分为四种:强引用、软引用、弱引用和虚引用(又称幽灵引用),在JDK1.2中引入了这四种引用,使得开发中可以在一定程度上虚范围的控制Java对象的生命周期。之所以说虚范围,是因为即使使用了非强引用,最终的垃圾回收发起也都是由JVM垃圾回收机制决定的,但是这种改变是一种进步,使我们在应用中更加灵活。
强引用:
一般在Java开发中使用的都是强引用,之所以称之为...
分类:
编程语言 时间:
2015-07-24 20:58:56
阅读次数:
226
范围:要回收哪些区域
在JVM五种内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行GC。
前提:如何判断对象已死
所有的垃圾收集算法都面临同一个问题,那就是找出应用程序不可到达的内存块,将其释放,这里面得不可到达主要是指应用程序已经没有内存块的引用了, 在...
分类:
其他好文 时间:
2015-07-22 09:26:16
阅读次数:
183
1:jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对...
分类:
其他好文 时间:
2015-07-19 11:33:12
阅读次数:
103
一、垃圾回收作用于“堆”和“非堆(方法区)”两个线程共享的部分。
1、堆:
堆的主要存放“生成的对象”和“开辟的数组”。
面试的时候可能会问道,是不是所有的对象都存在于堆上?答案是否定的,当前虚拟机优化技术的发展,其中出现了逃逸分析(如果一个方法中生成的对象没有被其他方法或者线程使用,那么就是不逃逸的),如果对象不逃逸,那么就会把对象分配到栈空间上。另,网上有人还列举了TLAB,但是T...
分类:
编程语言 时间:
2015-07-18 20:02:11
阅读次数:
129