JVM进阶系列一

第二部分:JVM内存区域

 

一:组成部分

方法区还包含如下:

加载的类信息、常量、静态变量、即时编译器编译后的代码等、运行时常量;

 

运行时常量,例如String中的intern()方法,如果String查找常量池中对象存在,就直接返回String对象;如果常量池中不存在,就把它添加到常量池中;

 

二:对象访问是如何进行的?

主流的访问方式:使用句柄和直接指针;

 

例如:eclipse设置显示GC,模拟java堆溢出

-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

 

设置最大方法区大小

-XX:+MaxPermSize

 

 

 

 

三:异常类型

1java堆溢出

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

2:虚拟机栈何本地方法栈溢出

-Xss128k

3:运行时常量池溢出

-XX:PermSize=10M -XX:MaxPermSize=10M

4方法区溢出

-XX:PermSize=10M -XX:MaxPermSize=10M

5本地直接内存溢出

-XX:MaxDirectMemorySize=10M

 

第三部分垃圾收集器与内存分配策略

 

 

 一:如何判断对象已死?

一般解决方案:引用计数算法,当一个地方引用它,计数器就加1;当引用失效时,计数器就减1,直到计数器为0,就表示这个对象已死,可以调用GC进行垃圾回收;

 

java垃圾收集器是采用"根搜索算法"

 

 

二:引用类型:(引用类型从强到弱顺序排列)

A:强引用

B:软引用

C:弱引用

D:虚引用

 

三:对象由生命周期:

 

 1生存的对象” -----通过根搜索算法判断  --------2第一次标记并且进行一次筛选此对象是否有必要执行finallize()(筛选条件:A:如果没有覆写finalize方法;BJVM虚拟机已经调用过了finalize方法),虚拟机就会判断没有必要执行;

 

 

2:如果虚拟机判断有必要执行的时候,就会把对象会放置到F-Queue中,稍后GC将对F-Queue队列进行第二次小规模标记;

 

注意:finallize()方法系统只调用一次,如果调用多次,系统不会执行;

 

 

四:垃圾收集算法:

A:标记-清除算法 缺点:1:效率低2:空间问题---会产生大量不连续的内存碎片,难以回收;

B:复制算法 ----修正标记--清除算法缺点,例如JVM中的Eden、两个Survivor,把其中的一个Survivor中一些存活的对象负责到另一个Survivor中,然后直接回收第一个Survivor内存块;然后交替执行,如果另一个Survivor内存空间比复制的对象内存小,就需要用到老生代中的内存;

C:标记-整理算法 

D:分代收集算法

 

五:垃圾收集器

ASerial收集器 ---单线程原理工作

BParNew收集器-----多线程Serial收集器实现,可以通过-XX:ParallelGCThreads参数来限制垃圾收集的线程数;

 

CParallel Scavenge收集器---一款新生代收集器

控制吞吐量参数:1:控制最大垃圾收集停留时间为-XX:MaxGCPauseMillis参数;2:直接设置吞吐量大小的-XX:GCTimeRatio参数

还有一个重要的参数:-XX:+UseAdaptiveSizePolicy,这是一个开关参数,这个参数打开以后,就不需要指定新生代的大小、EdenSurvivor区的比例、晋升老年代对象年龄等细节参数设置;

 

DSerial Old收集器-----Serial老生代收集器

EParallel Old收集器---Parallel Scavenge收集器的老生代版本

FCMS收集器----是一种以获取最短回收停顿时间为目标的收集器,目前应用于B/S系统的服务器上。整个过程分以下4个步骤:

1:初始标记

2:并发标记

3:重新标记

4:并发清除

参数-XX:CMSFullGCsBeforeCompaction这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次压缩的。

G:G1收集器

 

六:内存分配与回收策略

 

1:对象优先在Eden分配

2:大对象直接进入老年代

3:长期存活的对象将进入老年代

可以通过参数-XX:MaxTenuringThreshold来设置,默认为15岁,从Eden中到Survivor区每熬过一次Minor GC,年龄就加一岁;

4:动态对象年龄判定

5:空间分配担保

通过参数-XX:HandlePromotionFailure=false来设置,直接进行Full GC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tony168hongweigan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值