JVM怎么判断垃圾?

JVM采取判断一个对象是否为垃圾,采用引用计数法或者可达性分析算法

引用计数法则是给每个对象维持一个引用计数器count,如果有引用到其余对象则该值count++,引用消失则该值count–,count=0时则表示该对象没有任何引用,可当作垃圾回收。JVM一般不采用这种方法,当两个对象存在相互引用时,则两个对象都不会被回收。

可达性分析算法维护一个GC Roots引用链,引用链上引用的对象不会被当作垃圾回收。
在这里插入图片描述

像上图,及时object5-object7之间存在相互引用,但是三者并未在GC Roots引用链上,故而仍然会被当做垃圾对象回收。

GC Roots对象一般包括:

  1. 虚拟机栈(栈帧中本地变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Native方法)引用的对象。
  5. Java虚拟机内部的引用,例如基本数据类型对应的Class对象,一些常驻异常,还有系统类加载器
  6. 所有被synchronized持有的对象
设置 `export JVM` 可从不同场景和需求进行操作,以下是一些常见的设置方法: ### 在 Zookeeper 中设置 JVM 在 Zookeeper 里,可在 `./bin/zkEnv.sh` 文件中新增 JVM 相关配置。示例如下: ```bash # default heap for zookeeper server ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-1000}" export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS" ``` 此配置可调整 Zookeeper 服务器的堆内存大小,`ZK_SERVER_HEAP` 定义堆内存大小,默认是 1000MB,`-Xmx` 用于设置最大堆大小 [^1]。 ### 通用 JVM 调优参数设置 选择 JVM 参数时,可从以下几个方面着手: - **内存需求**:依据应用程序的需求,设置 `-Xms`(初始堆大小)和 `-Xmx`(最大堆大小)参数。 - **垃圾收集器**:使用 `-XX:+UseConcMarkSweepGC`、`-XX:+UseParallelGC`、`-XX:+UseG1GC` 等参数来挑选适合应用程序的垃圾收集器。 - **性能调优**:使用 `-XX:+PrintGC`、`-XX:+PrintGCDetails` 等参数来打印垃圾收集日志,助力了解应用程序的性能并进行调优。 - **诊断**:使用 `-XX:+HeapDumpOnOutOfMemoryError`、`-XX:HeapDumpPath=/path/to/dump` 等参数,在发生 `OutOfMemoryError` 时生成堆转储文件,便于后续分析。 - **线程数**:若应用程序是多线程的,可考虑使用 `-XX:ParallelGCThreads` 和 `-XX:ConcGCThreads` 来设置并行和并发垃圾收集器的线程数。 - **预测试**:在生产环境部署之前,模拟业务场景和硬件设备,在测试环境中验证所选参数的效果,确保它们能够满足应用程序的需求。 - **参考官方文档和社区**:参考 Oracle 官方文档和 Java 社区的建议,了解参数的最佳实践和使用场景 [^2]。 ### 综合参数设置示例 可以将各类 JVM 参数整合起来,如下所示: ```bash ## All together ## export JAVA_OPTS="$DEBUG_OPTS $JMC_OPTS $MEM_OPTS $GC_OPTS $GCLOG_OPTS $OPTIMIZE_OPTS $SHOOTING_OPTS $JMX_OPTS $OTHER_OPTS" ``` 这里的 `JAVA_OPTS` 涵盖了调试、管理、内存、垃圾回收、日志、优化、诊断、JMX 等多方面的参数设置 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值