JVM学习-内存结构(一)

一、引言

学前了解:

1.什么是JVM

1.1定义

Java Virtual Machine ,Java 程序的运行环境(Java 二进制字节码的运行环境)。

  • 好处

    • 一次编译,处处执行

    • 自动的内存管理,垃圾回收机制

    • 数组下标越界检查

  • 比较 JVM、JRE、JDK 的关系如下图所示

2.学JVM有什么用

  • 理解底层实现原理,比如:自动装箱、自动拆箱是怎么实现的,反射是怎么实现的,垃圾回收机制是怎么回事等待,JVM 是必须掌握的。

  • 中高级程序员必备技能,同时也是面试必备

3.常见的JVM

  • 我们学习的是HotSpot 版本的虚拟机。

4.学习路线

  • ClassLoader:Java 代码编译成二进制后,会经过类加载器,这样才能加载到 JVM 中运行。 Method Area:类是放在方法区中。 Heap:类的实例对象。 当类调用方法时,会用到 JVM Stack、PC Register、本地方法栈。 方法执行时的每行代码是有执行引擎中的解释器逐行执行,方法中的热点代码频繁调用的方法,由 JIT 编译器优化后执行,GC 会对堆中不用的对象进行回收。需要和操作系统打交道就需要使用到本地方法接口。

二、内存结构

1.内存结构的组成有五部分

2.程序计数器

2.1定义与特点

2.2解释:

程序计数器CPU中的寄存器实现

3.java虚拟机栈

3.1定义

1)栈与栈帧,栈就是每个线程所需要的空间(总的),栈帧是每个方法运行时所需要的

2)用程序解释如下:

3.2问题辨析

1)垃圾回收是否涉及栈内存?

不会。栈内存在每次方法调用结束后都会自动释放,不需要垃圾回收处理。

2)栈内存分配越大越好吗?

不是。因为物理内存是一定的,栈内存越大,可以支持更多的递归调用,但是可执行的线程数就会越少。运行时可以指定栈内存大小,有默认值。

3)方法呢的局部变量是否线程安全
  • 如果方法内部的变量没有逃离方法的作用访问,它是线程安全的

  • 如果是局部变量引用了对象,并逃离了方法的访问,那就要考虑线程安全问题。

  • static修饰的变量会产生线程安全因为是公共的,其他的不会因为是每个线程私有的。

  • 线程不安全例子如下(图中m2,m3都是不安全的):

    4)栈溢出错误:
    java.long.StackOverflowError
    5)运行时设置栈内存大小

3.3线程诊断(案例)

1)案例一:CPU占用过多

要求排查出是哪行代码导致的CPU占用过多(一个java代码运行在linux中)

nohup 让java代码在后台运行

top 命令可以检测到后台进程对CPU的使用对内存的占用情况

得到有问题的进程号是32655,但不能知道是进程中的那个线程

用PS命令定位线程,H是打印线程数 -eo是规定输出的信息

使用jdk提供的jstack命令查看具体进程中的,jstack +进程ID

可以列出所有的线程列出,再根据ps命令得到的线程号转为16进制即可看到具体有问题的行数(ps得到的为10进制),32665转16进制为7F99

总结

2)案例二:程序运行长时间没有结果

即线程死锁,还是使用jstack命令

可以看到,在最后有说明是用户线程1和用户线程0产生死锁分别在29行和21行

相关推荐
信徒_8 分钟前
Spring 中有哪些设计模式?
java·spring·设计模式
爱的叹息24 分钟前
关于 Spring自定义缓存管理器 的详细说明,包含两种实现方式的对比和代码示例,并附表格总结
java·spring·缓存
刘龙超31 分钟前
如何应对 Android 面试官 -> 网络如何优化?
android·java
IT瘾君42 分钟前
Java基础:Logback日志框架
java·开发语言·logback
suimeng642 分钟前
Java的Selenium的特殊元素操作与定位之select下拉框
java·自动化测试·selenium
ChinaRainbowSea1 小时前
8. RabbitMQ 消息队列 + 结合配合 Spring Boot 框架实现 “发布确认” 的功能
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
、BeYourself1 小时前
Sentinel[超详细讲解]-7 -之 -熔断降级[异常比例阈值]
java·spring cloud·sentinel
可乐加.糖1 小时前
腾讯云K8s容器部署SpringBoot项目实现方案
java·spring boot·容器·kubernetes·k8s·腾讯云
不断前进的皮卡丘2 小时前
06-公寓租赁项目-后台管理-公寓管理篇
java·开发语言·数据库·spring boot
luoluoal2 小时前
Java项目之基于ssm的个性化旅游攻略定制系统(源码+文档)
java·mysql·mybatis·ssm·源码