c语言的垃圾回收是人工回收,他们可控性强,java语言垃圾回收是自动的,可控性差,有时候会出现内存溢出的情况(内存溢出: 也就是jvm分配的内存对象过多,超过了最大可分配内存的大小)
提到垃圾回收机制,就要提到Gc方法,System.gc()这个方法就是来调用垃圾收集器的,在调用时,垃圾收集器将运行已回收但未使用的内存空间,它将尝试释放被丢弃对象占用的存,System.gc()方法有一个免责声明,它和finalize()方法一样不能保证马上能执行,有时候程序执行的比较快,到结束进程了都没有执行Gc,他只是告诉垃圾回收器要进行垃圾回收,但他不能保证完成任务.
在了解垃圾回收机制之前,我们需要对jvm有所了解
1.jvm的作用:
首先通过编译器把java代码转化成字节码,类加载器再把字节码加载到内存,将其放在运行时数据区(RuntimeData area)的方法区内,而字节码文件只是jvm的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎,将字节码翻译成底层系统指令,再交给CPU去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface) 来实现整个程序的功能
2.jvm内存模型(java栈,native栈,程序计数器(线程独占),堆,方法区(线程共享))
java栈: 属于线程私有区,存储栈帧
native栈:主要用于对接其他语言
程序计数器: 计算java栈执行的行数
方法区: 常量池,不可变的常量数据
堆: 存储所有对象,gc的主要回收空间
JVM区域总体分两类,heap(堆)区和非heap区。
heap区又分为:
Eden Space(伊甸园,新生代)、 Survivor Space(幸存者区)、 Old Gen(老年代)。 非heap区又分:
Code Cache(