谁能解释63个方块视频给我解释一下Java中什么是内存图?什么垃圾回收机制什么的?

谁能给我解释一下Java中什么是内存图?什么垃圾回收机制什么的?_百度知道
谁能给我解释一下Java中什么是内存图?什么垃圾回收机制什么的?
我听了好多课程了,就是听不懂画内存那块儿。老师说着说着就把我绕晕了,唉,比如栈堆:栈放局部变量:堆放成员变量,我就不懂如何把代码一个一个放进对应的区域,还有用完垃圾回收机制自动清除?
我有更好的答案
回收机制就是 当一些资源被创建使用之后或不在调用的话 就会变成垃圾,垃圾的话会占用空间,这时候就需要释放空间给其他程序使用,所以JAVA拥有自动垃圾回收机制,会在适当的时候自动调用垃圾回收 释放资源,程序员也可以手动调用释放资源等等。 如: public class A { S public A(String str){ this.str= } public String toString(){ } @Override protected void finalize() throws Throwable { System.out.println(&我是&+str+&.我被回收了..&); } public static void main(String[] args) { A a=new A(&李四&); a= System.gc(); //运行结果 我是李四.我被回收了.. } }
采纳率:84%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一、本文参考:
& &1.《深入理解java虚拟机 JVM高级特性与最佳实践》
二、对象已死的判定方法
& & & 要进行JVM中对象回收首先要判断对象是否已经死亡,判断的方法有如下几个:
& & &1.引用计数法
& & & & &给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻 计数器为0的对象就是不可能再被使用的。
&但是主流的java虚拟机里面没有选用引用计数器算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。
& & &2.可达性分析算法
& & &这个算法的基本思想就是通过一系列的称为&GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连接时,则证明此对象是不可用的。如下图所示,对象object5、object6、object7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收对象。
三、导致内存泄漏的情况及代码
java 堆内存泄漏。是由于java对象不停创建但是没有释放对象引用导致的。
以下是关于java代码,此代码是引自
类com.code.revisited.memoryleaks.Stack提供了实现栈的一些方法,包括遍历,入栈,出栈等操作。假设原来目的是为了现实使用(当然这里是为了解释内存泄漏)。
package com.code.revisited.
import java.util.I
import java.util.NoSuchElementE
* @author sureshsajja
public class Stack&E& implements Iterable&E& {
private int N;
private E[]
@SuppressWarnings("unchecked")
public Stack(int capacity) {
array = (E[]) new Object[capacity];
public Iterator&E& iterator() {
return new StackIterator();
private class StackIterator implements Iterator&E& {
private int i = N - 1;
public boolean hasNext() {
return i &= 0;
public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
return array[i--];
public void remove() {
throw new UnsupportedOperationException();
public void push(E item) {
if (isFull()) {
throw new RuntimeException("Stack overflow");
array[N++] =
public E pop() {
if (isEmpty())
throw new RuntimeException("Stack underflow");
E item = array[--N];
public boolean isEmpty() {
return N == 0;
public int size() {
public boolean isFull() {
return N == array.
public E peek() {
if (isEmpty())
throw new RuntimeException("Stack underflow");
return array[N - 1];
类com.code.revisited.memoryleaks.StackTest用于执行栈操作。要进行入栈及出栈10000次操作,理想是入栈时分配堆内存,出栈后对象被回收。
package com.code.revisited.
sureshsajja
public class StackTest {
* @param args
public static void main(String[] args) {
Stack&Integer& s = new Stack&Integer&(10000);
for (int i = 0; i & 10000; i++) {
s.push(i);
while (!s.isEmpty()) {
while (true ) {
// do something
执行开始。我们使用VisualVM进行观察。为了更明显一些,将栈操作部分代码注释也执行一下。
package com.code.revisited.
sureshsajja
public class StackTest {
* @param args
public static void main(String[] args) {
Stack&Integer& s = new Stack&Integer&(10000);
for ( int i = 0; i & 10000; i++) {
s.push(i);
while (!s.isEmpty()) {
while (true ) {
// do something
把栈操作的设为1号,没有栈操作的设置为2号,分别生成Heap Dump文件,我们看一下类实例的截图:
首先是1号截图
首先是2号截图
显然预期的栈操作出栈后并没有释放掉Integer对象的引用(实际上看代码也知道),所以不会被GC回收。真正的实际情况这种引用将会很隐蔽,但是根本总是由于对象仍然被引用。
& 本篇仅对java堆内存泄漏进行了简单说明,下一篇将讨论其他相关的内存泄漏。有不对的地方欢迎拍砖&_&
阅读(...) 评论()
Helloworldjava中垃圾回收有哪几种机制?_百度知道
java中垃圾回收有哪几种机制?
我有更好的答案
强引用在一般的Java程序中,见到最多的就是强引用(strong reference)。如Date date = new Date(),date就是一个对象的强引用。对象的强引用可以在程序中到处传递。很多情况下,会同时有多个引用指向同一个对象。强引用的存在限制了对象在内存中的存活时间。假如对象A中包含了一个对象B的强引用,那么一般情况下,对象B的存活时间就不会短于对象A。如果对象A没有显式的把对象B的引用设为null的话,就只有当对象A被垃圾回收之后,对象B才不再有引用指向它,才可能获得被垃圾回收的机会。除了强引用之外,java.lang.ref包中提供了对一个对象的不同的引用方式。JVM的垃圾回收器对于不同类型的引用有不同的处理方式。软引用软引用(soft reference)在强度上弱于强引用,通过类SoftReference来表示。它的作用是告诉垃圾回收器,程序中的哪些对象是不那么重要,当内存不足的时候是可以被暂时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那些只被软引用所指向的对象。如果全部释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。比如考虑一个图像编辑器的程序。该程序会把图像文件的全部内容都读取到内存中,以方便进行处理。而用户也可以同时打开多个文件。当同时打开的文件过多的时候,就可能造成内存不足。如果使用软引用来指向图像文件内容的话,垃圾回收器就可以在必要的时候回收掉这些内存。publicclass ImageData {
private SoftReference&byte[]& dataR
public ImageData(String path) {
this.path =
dataRef = new SoftReference&byte[]&(newbyte[0]);
privatebyte[] readImage() {
returnnewbyte[1024 * 1024]; //省略了读取文件的操作
publicbyte[] getData() {
byte[] dataArray = dataRef.get();
if (dataArray == null || dataArray.length == 0) {
dataArray = readImage();
dataRef = new SoftReference&byte[]&(dataArray);
return dataA
}}在运行上面程序的时候,可以使用 -Xmx 参数来限制JVM可用的内存。由于软引用所指向的对象可能被回收掉,在通过get方法来获取软引用所实际指向的对象的时候,总是要检查该对象是否还存活。弱引用弱引用(weak reference)在强度上弱于软引用,通过类WeakReference来表示。它的作用是引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果一个对象的所有引用都是弱引用的话,该对象会被回收。弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。哈希表的接口允许使用任何Java对象作为键来使用。当一个键值对被放入到哈希表中之后,哈希表对象本身就有了对这些键和值对象的引用。如果这种引用是强引用的话,那么只要哈希表对象本身还存活,其中所包含的键和值对象是不会被回收的。如果某个存活时间很长的哈希表中包含的键值对很多,最终就有可能消耗掉JVM中全部的内存。对于这种情况的解决办法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。Java中提供了WeakHashMap来满足这一常见需求。幽灵引用在介绍幽灵引用之前,要先介绍Java提供的对象终止化机制(finalization)。在Object类里面有个finalize方法,其设计的初衷是在一个对象被真正回收之前,可以用来执行一些清理的工作。因为Java并没有提供类似C++的析构函数一样的机制,就通过 finalize方法来实现。但是问题在于垃圾回收器的运行时间是不固定的,所以这些清理工作的实际运行时间也是不能预知的。幽灵引用(phantom reference)可以解决这个问题。在创建幽灵引用PhantomReference的时候必须要指定一个引用队列。当一个对象的finalize方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了。幽灵引用及其队列的使用情况并不多见,主要用来实现比较精细的内存使用控制,这对于移动设备来说是很有意义的。程序可以在确定一个对象要被回收之后,再申请内存创建新的对象。通过这种方式可以使得程序所消耗的内存维持在一个相对较低的数量。
管他几种呢。你只用保证对象任务完成后指向他的引用没有了就行,要诀是尽量缩短对象的生命周期,比如能定义方法内对象的就不要定义成类里面的对象。
为您推荐:
其他类似问题
您可能关注的内容
垃圾回收的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。java中垃圾回收的优点与原理?_百度知道
该问题可能描述不清,建议你
java中垃圾回收的优点与原理?
我有更好的答案
&java垃圾回收的优点:它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有&作用域&的概念,只有对象的引用才有&作用域&。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。&java垃圾回收的原理:& 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
采纳率:82%
来自团队:
java基础知识个人总结-- 垃圾回收的优点和原理 JAVA中的对象是在堆上分配,而在堆上分配存储空间的方式是昂贵的.正是由于GC才使java在堆上的空间分配速度得以于其他语言在堆栈上分配速度相媲美.java对象也不再有作用域的概念.作用域是对于引用而言的.垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收.程序可以用System.gc() 或Runtime.getRuntime().gc()
请求垃圾回收,但并不保证立即执行垃圾回收.GC的工作原理: 引用计数,标记复制&引用计数&是一种简单但速度很慢的垃圾回收技术.所有对象都有一个引用计数器,当有引用连接时计数器加1,当引用离开作用域时或者被置于NULL时,计数器-1,垃圾回收器会在所以包含对象引用的列表上进行遍历,当发现某个对象的引用计数为0时,就释放占用的空间.&标记复制&的运行机制,垃圾回收器遍历包含所有引用的列表,当发现存活的对象引用时做上标记,这样当遍历完所有对象引用并做上标记的时候,执行垃圾回收,将没有标记的对象堆空间释放.垃圾回收机制的优点:Java的垃圾回收机制是的程序员不用担心内存空间的分配,减少了内存溢出.但同时也牺牲了一定的性能.
本回答被网友采纳
全面分析java垃圾回收机制:
为您推荐:
其他类似问题
垃圾回收的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Java 的内存管理机制是怎样的?_百度知道
Java 的内存管理机制是怎样的?
Java的内存分配有三种, 1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。
采纳率:36%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 解释程序的功能是 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信