黑马Java虚拟机 JVM(一)

本文介绍了Java虚拟机(JVM)的概念及其好处,包括一次编写到处运行、自动内存管理和垃圾回收。接着详细阐述了程序计数器、Java虚拟机栈的作用及特点,指出垃圾回收不涉及栈内存。讨论了栈内存分配的影响,以及方法内局部变量的线程安全性。最后,分析了栈内存溢出的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是JVM?
  • Java Virtual Machine, Java程序运行环境(Java二进制字节码的运行环境)
  • 好处
    • 一次编写,到处运行
    • 自动内存管理,垃圾回收功能
    • 数组下标越界检查
    • 多态(虚方法表实现)
2. Program Counter Register 程序计数器(寄存器)
  • 作用:记住 下一条jvm指令的执行地址
  • 特点:
    • 是线程私有的,随着线程创建而创建,随线程销毁而销毁0
    • 不会存在内存溢出
3. Java Virtual Stacks (Java虚拟机栈)
  • 每个线程运行时所需的内存,称为虚拟机栈
  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
4. 垃圾回收是否涉及栈内存?
  • 不会。栈帧内存 在每次方法调用结束后会自动弹出栈(自动回收),不需要回收(垃圾回收回收堆内存中无用对象,不会回收栈内存)
5. 栈内存分配越大越好吗?
  • 不是。栈内存大了,通常可进行更多次方法调用,并不会提高效率,反而会使线程数目变少
6. 方法内的局部变量是否是线程安全的?
  • 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
  • 如果是局部变量引用了对象,并逃离方法的作用方法,需要考虑线程安全
// 多个线程同时执行此方法,各线程中x值互不影响
static void m1(){
	int x = 0;
	for(int i = 0; i < 500; i++){
		x++;
	}
	System.out.println(x);
}
package JVM;

public class Demo01 {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append(4);
        sb.append(5);
        sb.append(6);
    }


    /**
     * 不会有线程安全问题,因为StringBuilder是线程内局部变量,属于线程私有,其他线程无法访问
     */
    public static void m1() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(1);
        stringBuilder.append(2);
        stringBuilder.append(3);
        System.out.println(stringBuilder.toString());
    }

    /**
     * 不是线程安全的,StringBuilder作为参数传入,StringBuilder可能被其他线程共享,不是线程安全
     */
    public static void m2(StringBuilder stringBuilder) {
        stringBuilder.append(1);
        stringBuilder.append(2);
        stringBuilder.append(3);
        System.out.println(stringBuilder.toString());
    }

    /**
     * 不是线程安全,虽然StringBuilder是作为局部变量,但是返回结果为StringBuilder,可能被其他线程修改
     */
    public static StringBuilder m2() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(1);
        stringBuilder.append(2);
        stringBuilder.append(3);
        return stringBuilder;
    }
}

7. 栈内存溢出(StackOverflow)
  • 栈帧过多导致栈内存溢出(如递归未设置终止条件)
  • 栈帧过大导致栈内存溢出
### 黑马点评使用的虚拟机技术 黑马点评项目中涉及的技术栈主要集中在 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、付费专栏及课程。

余额充值