JVM笔记(类加载图和jvm垃圾处理机制一)

jvm虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统,是物理机的软件实现。

类的加载过程

编译加载图如下:

jvm和java无关。 jvm只执行class文件。

jvm是一种规范。

什么是垃圾

c语言申请内存:malloc free

c++:new delete

java:  new申请   自动回收

自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现下面错误:

1、忘记回收

2、多次回收

没有任何引用指向的一个对象或者多个对象(循环引用)的对象,被定义为垃圾。

如何定位垃圾

1、引用计数     (不能解决循环引用问题)

对象被一次引用以后计数+1,多次引用依次递加。找到引用次数为0的对象被定义为垃圾对象。

2、根可达算法   

通过主线程main, 找到被new的对象  静态变量  常量池   jni指针引用的变量为根对象  如果根对象找不到的对象,被定义为垃圾

常见的垃圾回收算法

1、标记清除

找到垃圾以后,将内存区域标记修改成非垃圾区域,位置不连续,产生碎片。

2、拷贝算法

将内存空间切割成两部分,比如A空间,B空间。需要清理空间的时候,将A的有用数据复制到B空间,然后直接清理A空间数据。下次分配数据的时候将数据分配到A空间。

优点:没有碎片,浪费空间。缺点:非常浪费空间。

3、标记压缩算法

找到垃圾以后,将垃圾标记清除的同时,将有用内存进行排成序整理。

优点:没有碎片,空间利用率高。缺点:效率偏低。

JVM分代模型

1、部分垃圾回收器使用的模型

new -young  新生代

新生代=eden区+2个survivor区 

新生代满了以后触发MinorGC=YGC

 YGC回收之后,大多数对象都会被回收,活着的对象进入survivor1

再次YGC以后,活着的对象eden+survivor1->survivor2

再次YGC以后,活着的对象eden+survivor2->survivor1

年龄足够->进入老年代(15岁,每次YGC加1岁)

 

old 老年代

存储一些顽固分子,大对象或者15岁以上的对象

老年代满了会触发MajorGc=FGC

尽量减少FGC,因为它回收对象的时候,会将所有内存空间进行清理,并进行一次整理。

 

永久代(1.7)/元数据区(1.8)metaspace

永久代和元数据作用:装Class对象

永久代:必须指定大小限制;元数据区:可以设置也可以不设置,无上限(受限于物理内存)

字符串常量1.7存在永久代,1.8以后存在堆内存中

methidArea逻辑概念-永久代、元数据

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值