JVM笔记

本文详细介绍了JVM的内存结构,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。讨论了线程私有的内存区域如栈和程序计数器,以及线程共享的堆和方法区。文章还提到了内存溢出的问题,如栈内存溢出(-Xss)和堆内存溢出(-Xmx),并提供了诊断工具如jstack、jmap和jconsole的使用案例。

JVM笔记

一、内存结构

1.程序计数器

  • 作用:记住下一条jvm指令的执行地址
  • 特点:是线程私有的,不会存在内存溢出。

2.虚拟机栈

  • 每个线程运行时所需要的内存,称为虚拟机栈
  • 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存(局部变量,函数传参)
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
  • 栈内存溢出(-Xss设置栈内存大小 )
    • 栈帧过多导致栈内存溢出
    • 栈帧过大导致栈内存溢出
  • 线程运行诊断
    • 案例一:cpu占用过多
      • 定位:用top定位哪个线程对cpu的占用过高
      • ps H -eo pid,tid,%cpu | grep 进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高)
      • jstack 进程id:可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行号。
    • 案例二:代码运行很久

3.本地方法栈

本地方法栈为虚拟机使用到的本地方法服务。

4.堆

4.1 定义
  • 通过new关键字,创建对象都会使用堆内存
  • 特点
    • 它是线程共享的,堆中对象都需要考虑线程安全问题
    • 有垃圾回收机制
4.2 堆内存溢出(-Xmx)
4.3 堆内存诊断
  • jps工具
  • jmap工具
    查看堆内存占用情况 jmap -heap 进程id
  • jconsole工具

5. 方法区

- 各个线程共享区域
- 在JVM启动时被创建 ,并且物理内存可以不连续
- 大小可以固定也可以是动态扩展的
- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类会出现OOM错误
- 会随着JVM的关闭而释放这一区域的内存

方法区的演进:

### 关于JVM的学习资源 对于希望深入学习 Java 虚拟机 (JVM) 的开发者来说,《黑马程序员 JVM 完整教程》是一份非常有价值的入门材料[^1]。这份笔记涵盖了 JVM 基础概念、内存模型以及性能调优等内容,适合初学者快速掌握 JVM 的核心知识点。 如果需要更深层次的理解,可以参考以下书籍: 1. **《深入理解 Java 虚拟机:Jvm 高级特性与最佳实践(第 2 版)》** 这本书详细讲解了 JVM 的内部机制,包括类加载过程、垃圾回收算法、性能优化策略等高级主题。它不仅提供了丰富的理论知识,还通过实际案例帮助读者解决常见的 JVM 性能问题。 2. **《实战 Java 虚拟机》** 此书侧重于 JVM 实战技巧,特别适用于那些希望通过真实项目经验提升技能的技术人员。书中包含大量实用工具和技术的应用场景分析。 3. **《深入 JAVA 虚拟机第二版》** 另一本经典著作,专注于 JVM 架构设计及其运行原理,能够为开发者的日常编码提供指导和支持。 除了上述书籍外,在线还有许多免费资源可供利用。例如官方文档总是最好的起点之一;另外像 Oracle 提供的各种技术白皮书也是不可多得的好资料。 需要注意的是,当涉及到并发编程时,了解重排序现象非常重要。因为即使代码按特定顺序编写出来,编译器或者处理器为了提高效率可能会改变它们的实际执行次序——只要这种变化不会影响单线程环境下的最终结果即可[^2]。 至于方法实现方面,则需确保函数签名中的返回类型同其逻辑体内的最后一句`return`表达式的类别相一致。否则将会引发编译错误[^3]。 以下是基于这些原则的一个简单示例展示如何判断一个数是否偶数并找出两个数值之间的较大者: ```java public class Example { public static void main(String[] args){ System.out.println(isEvenNumber(4)); // 输出true System.out.println(getMax(8,5)); // 输出8 } public static boolean isEvenNumber(int number ){ return ((number % 2)==0); } public static int getMax(int a,int b){ if(a>b) return a; else return b; } } ``` ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值