jvm_自动内存管理

JVM虚拟机

JVM虚拟机组成:类加载器 、运行时数据区 、本地方法库 、执行引擎

JVM的内存管理也主要在运行时数据区 。运行时数据库包括: 堆 、栈、方法区、本地方法栈 、程序计数器。其中堆和方法区是线程共享的,栈、本地方法栈、程序计数器线程私有

 

运行时数据区

 

程序计数器:存放当前线程所执行字节码行号,如果是native方法,则程序计数器为
undefined



Java虚拟机栈:java栈是线程私有的。当一个方法执行时,当前的线程所拥有的栈就会
创建一个栈帧,存放存放局部变量表、操作数栈、动态连接、方法出口等信息,方法执行
完毕栈帧出栈,当栈的深度大于虚拟机锁允许的深度,则报出StackOverFlowError异常。 
对于Hotspot虚拟机来说,java栈是不允许动态扩容的,所以不会出现内存溢出 OutOfMe
moryError异常



本地方法栈 :与java虚拟机栈功能类似,不过服务对象不同。当本地方法执行时,会在本
地方法栈创建一个栈帧,存放局部变量表、操作数栈、方法出口等信息,方法执行完毕,栈
帧出栈。



堆:存放java引用对象的地方,线程共享的,是垃圾回收机制主要的工作空间。堆空间按分
代算法垃圾回收,可以分为新生代和老年代,比例是1:2 .



方法区:方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储
已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

垃圾回收机制

堆空间是垃圾回收的主要场所:垃圾回收算法主要包含5种,标记-复制算法、标记-清除算法、标记-整理算法、分代收集算法、

 

标记清除算法:把需要回收的对象进行标记,然后清除标记对象,然后标记没回收的对象,清除没有被标记的对象。缺点:由于清除的对象空间是不连续的,会造成不连续的内存碎片

 

 

标记复制算法:把内存区域分为两个块区域,把存活对象复制到内存另一端,然后清除这一端的内存块的所有数据。虽然克服了内存碎片问题,但是降低了可用内存大小,对象内用内存大小一半时,就需要执行垃圾回收。

 

 

 

标记整理算法:将存活对象移动到内存的一端,然后直接清理边界以外的内存。

 

 

判断对象需要GC的方法: 引用计数法和可达性分析

 

引用计数法:每个对象都会有一个引用计数,对象被引用一次,则把引用技术加1,当引用计数为0时,则对象需要GC。缺点:无法解决循环引用导致对象无法GC的问题

 

可行性分析:从GC root对象出发,把各各对象关联形成一个链路,对于不在此链路的对象GC. GC ROOT 对象包括栈的栈帧中引用的对象,方法区类静态属性引用的对象,方法区常量池引用的对象等

 

常见的垃圾收集器

 

 

java常见的垃圾收集器有七种。

 

Serial收集器:串行收集器,作用于新生代。属于单线程垃圾回收器,当进行垃圾回收时,会终止所有线程的工作,使用复制算法实现垃圾回收。

 

ParNew :Serial的多线程版本,作用域新生代,由于性能原因,需要和CMS垃圾回收器一起使用

 

Parallel Scavenge:作用域老年代,使用复制算法

 

Serial Old:作用于老年代,使用标记整理算法

 

Parallel Scavenge Old :老年代,标记整理

 

CMS:作用于老年代 标记清除   和ParNew一起使用

 

G1:使用复制和标记整理算法收集老年代和新生代垃圾

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值