https://blog.csdn.net/qq_36704549/article/details/109390566
堆:局部变量,对象的引用变量,方法运行
栈:存储new出的东西,实例化对象;数组;16进制存储数据;由jvm自动垃圾回收器;
方法区:.class相关信息;
本地方法区:操作系统相关
寄存器:CPU相关

  1. JVM中堆和栈的区别
  2. 1、栈是线程私有的;堆事线程公有的。
  3. 2、栈主要用于存储局部变量和对象的引用变量;堆主要用于存储实例化的对象,数组,由JVM动态分配内存空间。
  4. 3、栈中的变量超过其作用域后,JVM会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用;在堆中分配的内存,由JVM自动垃圾回收器来管理。
  5. 4、如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError;而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError
  6. 5、栈的内存要远远小于堆内存。

GC

https://blog.csdn.net/laomo_bible/article/details/83112622
主要作用区域java堆和方法区

GC对象:

引用计数;可达性分析( GC Roots ,引用链)

GC触发:

System.gc;根据Eden区和From Space区内存决定,空间不足时触发
minor GC 和 Full GC ( Minor GC )

GC算法

标记清除;标记-压缩;复制算法;分析收集算法
新生代,老年代

垃圾收集器

serial收集器
并行收集器(parNew,parallel收集器)
CMS收集器
G1收集器

finalize()

(1)finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。 (2)finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性 (3)不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]


总结

1.尽早释放无用对象的引用; 复杂的对象图,例如数组,队列,树,图等 引用较为复杂回收效率低,尽早将不用的引用对象复制null,利于GC 2.finalize()是提供手动释放对象资源的机会,但会加大GC工作量 3.常用的图片使用soft应用类型,它尽可能将图片保存在内存中,不引起oom 4.集合数据类型的回收更复杂,全局,静态变量容易引起悬挂对象,造成资源浪费 5.当有等待时间可手动执行System.gc();使用增量式GC可缩短java程序暂停时间