黑马Java虚拟机JVM(三)

1. 直接内存(Direct Memory)
  • 常见于NIO操作时,用于数据缓冲区
  • 分配回收成本较高,但读写性能高
  • 不受JVM内存回收管理
2. 引用计数法被引用两次则
  • 只要一个对象被其它变量所引用,则计数加一,如果被引用了两次,则计数变为二,如果某个变量不再引用它,则计数减一。如果计数变为零,会被回收。
  • 存在循环引用的问题。如下图,A B不会被回收
    在这里插入图片描述
3. 可达性分析算法
  • 根对象:可理解为肯定不会被回收的对象
  • 在垃圾回收之前,先对堆中所有对象进行扫描,看看每个对象是否被跟对象直接或者间接引用,如果被引用,则不能回收,否则将被回收
  • Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
  • 扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收
4. 几种引用
  1. 强引用
  • 只有所有GC Roots对象都不通过强引用引用该对象,该对象才能被垃圾回收
  1. 软引用(SoftReference)
  • 仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次触发垃圾回收,回收软引用对象
  • 可以配合引用队列来释放软引用自身
  1. 弱引用(WeakRefence)
  • 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
  • 可以配合引用队列来释放弱引用自身
  1. 虚引用(Phantom Reference)
  • 必须配合引用队列使用,主要配合ByteBuffer使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存
  1. 终结器引用(Final Reference)
  • 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用对象
5. 垃圾回收算法
  1. 标记清除 (Mark Sweep)
  • 速度较快
  • 会造成内存碎片
    在这里插入图片描述
  1. 标记整理(Mark Compact)
  • 速度慢
  • 没有内存碎片
    在这里插入图片描述
  1. 复制(Copy)
  • 不会有内存碎片
  • 需要占用双倍内存空间
    在这里插入图片描述
6. 分代垃圾回收
  • 对象首先分配在伊甸园区
  • 新生代空间不足时,触发minor gc,伊甸园和from存活的对象使用copy复制到to中,存活的对象年龄加1并且交换from to
  • minor gc会引发stop the world,暂停其它用户线程,等垃圾回收结束后,用户线程才恢复运行
  • 当对象寿命超过阈值时,会晋升至老年代,最大寿命是15(4bit)
  • 当老年代空间不足,会先尝试触发minor gc,如果之后空间仍不足,那么触发full gc,STW的时间更长
### 黑马点评使用的虚拟机技术 黑马点评项目中涉及的技术栈主要集中在 Redis 的应用上,但对于其底层支持的 Java 应用来说,确实依赖于特定的虚拟机技术来运行。Java 应用通常运行在 JVM (Java Virtual Machine) 上。 JVM 是一种抽象计算模型,它实现了编译一次,在任何地方运行的原则。这使得开发者能够编写程序而不必关心具体的硬件平台细节[^1]。对于像黑马点评这样的大型应用程序而言,选择合适的 JVM 配置至关重要,因为良好的配置可以直接影响到系统的性能表现以及资源利用率。 #### 垃圾回收机制的重要性 为了提高效率并减少内存泄漏的风险,现代 JVM 提供了多种垃圾收集器选项。通过设置 `-verbose:gc` 参数可以监控垃圾回收过程中的详细信息,这对于调优和诊断非常重要[^2]。合理的 GC 设置可以帮助优化应用性能,尤其是在高并发场景下。 #### 线程管理与资源共享 除了高效的垃圾回收外,如何处理多线程环境下的数据一致性也是一个挑战。在线程间共享的数据结构需要特别注意同步控制;相反地,那些仅属于单个线程的对象则相对简单得多——它们会随着所属线程生命周期的变化而自动创建或销毁,并且当某个方法执行完毕后,该方法所占用的方法栈也会被清理掉[^3]。这种设计有助于简化编程复杂度的同时也提高了安全性。 综上所述,虽然官方文档并没有明确指出黑马点评具体采用了哪种版本或者类型的 JVM ,但从上述讨论可以看出,该项目必然受益于先进的 JVM 特性如高效能GC算法和支持复杂的多线程操作等功能的支持。 ```java // 示例:启用详细的垃圾回收日志记录功能 public class Main { public static void main(String[] args) { System.setProperty("javax.xml.accessExternalDTD", "all"); String gcLogOption = "-Xlog:gc*:file=gc.log:time,uptime,pid,tid"; // 启动参数可以通过命令行传递给 JVM // java -XX:+PrintGCDetails -jar your-application.jar } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SimpleZihao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值