【javaGC】

JDK、JRE、JVM区别与联系

JVM

jvm(Java Virtual Machine),java虚拟机,java运行时的环境,是一种用于计算机设备的规范,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
java虚拟机在执行字节码时,把字节码解释成具体平台的机器指令。
jvm实现了平台无关性,jvm屏蔽了具体操作平台的具体信息,使得java程序只需要生成在jvm上运行的字节码,就可以在不同平台上不加修改的运行,实现了一次编译多处运行。

JRE

JRE(Java Runtime Environment,Java运行环境)
包含jvm和java核心类库。是Java运行环境,

JDK

JDK(Java Development Kit) 是java开发工具包,包括了JRE。

GC

怎么定义垃圾

引用计数法

在对象中引入一个计数器,每当有一个地方引用它就加一,引用失效就减一。当引用计数器为0时就意味着是垃圾。

但是主流的虚拟机都没用选用引用计数法,因为必须要配合大量的额外处理才能够保证正确地工作,譬如简单的引用计数法就无法解决对象之间的循环引用。

可达性分析法

将GC Root作为起始节点,从这些节点开始,根据引用关系向下搜索,搜索时走过的路径称为“引用链”,若某个对象到GC Root之间没用任何引用链连接,或者用图论的话来说,从GC Root到这个对象不可达时,则证明该对象是垃圾
GCRoot:以下地方直接或间接引用的对象

  1. 栈:正在使用不能删除
  2. 本地方法栈
  3. 方法区:全局变量,需要保留。

GC算法

1.标记—清理法

在对象后面标记,再扫描一遍就将其删除掉。
缺点:产生内存碎片

2.标记—整理法

在清除之后,后面对象往前面顶
缺点:前移代价大

3.复制算法

将内存分为1区和2区,在1区创建对象,之后标记1区是否需要删除,在1区快满的时候将不需要删除,紧凑的复制到2区。
缺点:需要两倍的内存。

实际GC算法

将java堆分为young区和old区。

young区的垃圾回收器是ParNew垃圾回收器。按照8:1:1将young区分为eden区,以及两个servivor区,来交替工作,提高利用率。新创建的对象一般被分配到eden区,当该区满了之后就会触发一次young GC,采用复制算法,将eden区不需要删除的对象复制到servivor区。

old区,在yongGC时年龄加一,直到满了6岁,就会复制到old区。同时存一些大对象。在old GC会同时伴随young GC,所以又称full GC,full GC 会引起stop the world,整个程序暂停,采用标记-清理。标记-整理。

在正式Minor GC之前会检查young区中的对象,比old区剩余空间大还是小。假如Minor GC后survivor区放不下剩余对象,这些对象就要进入old区。

  1. old区剩余空间大于young区对象大小,就直接GC。就算survivor区不够放,old区还是够放的
  2. 小于。查看是否启用了“老年代空间分配担保规则”
  1. 如果老年代剩余空间大小大于历次Minor GC之后剩余对象大小,那就允许Minor GC.因为从概率上讲,以前放得下,现在也放得下。那就会产生两种情况
  2. 如果小于,进行full GC.

GC失败原因

  1. full GC 仍然放不下,只能OOM.
  2. 未开启老年代分配担保规则,且full GC后仍然放不下,只能OOM.
  3. 开启了老年代分配担保规则,但是担保不通过,只能OOM.

虚拟机堆和栈的区别

1. 功能和作用:

栈是用来执行程序的,堆是用来存放对象的

栈:栈可以看作方法的运行模型,所有方法的调用都是通过栈帧实现的,jvm会为每个线程分配一个栈,jvm只对栈进行压栈和出栈操作。当一个线程进入一个java方法函数时,就会在当前栈中压入一个栈帧保存当前线程的状态,当退出函数时,会讲该

2. 性能与存储要求:

3. 内存的分配与回收:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java的垃圾回收(Garbage Collection, GC)是由Java虚拟机(JVM)自动执行的内存管理机制。配置Java GC的主要目的是调整内存管理和垃圾回收策略,以达到更好的性能和内存利用率。 以下是一些常见的Java GC和JVM配置选项: 1. 选择垃圾回收器(GC algorithm):Java提供了多种垃圾回收算法,如Serial GC、Parallel GC、CMS GC、G1 GC等。可以通过设置`-XX:+UseSerialGC`、`-XX:+UseParallelGC`、`-XX:+UseConcMarkSweepGC`、`-XX:+UseG1GC`等选项来指定使用的垃圾回收器。 2. 设置新生代和老年代大小:Java堆内存被分为新生代(Young Generation)和老年代(Old Generation),可以通过`-Xmn`选项设置新生代大小,通过`-Xmx`和`-Xms`选项设置堆最大和初始大小。 3. 调整垃圾回收的停顿时间:默认情况下,JVM会尽量减少垃圾回收过程对应用程序的停顿时间,但可能会牺牲一些吞吐量。可以通过`-XX:MaxGCPauseMillis`选项设置最大停顿时间。 4. 设置垃圾回收相关参数:可以通过一些参数来调整垃圾回收的行为,如`-XX:MaxTenuringThreshold`设置对象进入老年代的年龄阈值,`-XX:SurvivorRatio`设置新生代Eden区和Survivor区的大小比例等。 5. 监控和调优:可以使用JVM提供的工具(如jstat、jconsole、jvisualvm等)来监控垃圾回收情况和内存使用情况,从而进行优化和调整。 需要注意的是,不同的应用程序和场景可能需要不同的GC和JVM配置,具体的配置需要根据实际情况进行调整和优化。此外,建议在进行GC和JVM配置调整时,先进行性能测试和监控,以确保配置的改变能够带来预期的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值