jvm初识

学习jvm我们首先要明白2个问题
1、什么是jvm
2、jvm有什么用

jvm的定义

(Java Virtual Machine,Java虚拟机)java运行的环境(java二进制字节码的运行环境)JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

jvm的好处

1、一次编写,到处运行(jvm屏蔽了字节码底层操作原理,对外提供一个一致的运行环境)
2、自动内存管理,垃圾回收功能
3、数组下标越界检查、
4、多态等

jvm jre jdk的比较

一张图说明:
在这里插入图片描述

jvm的用处

1、面试(基本上面试都多少问你一点)
2、了解底层原理;(如动态代理、反射等)
3、中高程序员必备技能

jvm的组成

在这里插入图片描述
主要分为三大块:类加载器(classloader) 、jvm内存结构、执行引擎

jvm的内存结构

由上图可以看出内存结构由5部分构成:
1、程序计数器
2、虚拟机栈
3、本地方法栈
4、堆
5、方法区

程序计数器

作用:记住下一条jvm指令的执行地址
特点:1、线程私有的 2、不会存在内存溢出
程序计数器的工作原理:
java源码

  PrintStream out = System.out;
        out.println(1);
        out.println(2);
        out.println(3);

编译后对应的class文件(jvm指令),可以在窗口中用

javap -verbose xxx.class

在这里插入图片描述
class文件在window、linux都是一样的
这些jvm指令(二进制字节码)怎样执行的呢 是直接cpu执行吗
流程是: 0: getstatic #2 这条指令先交给解释器(执行引擎中的)解释成为一条机器码,然后机器码交给cpu(只认机器码)执行,但是和程序计数器啥关系呢,这就看程序计数器的作用是存储下一条指令,这里就会把 3: astore_1 执行地址存进去,然后解释器执行3 然后交给cpu,重复过程;

虚拟机栈
定义

Java虚拟机栈(Java Virtual Machine Stack) ,早期也叫Java栈,每个线程在创建时都会创建一个虚拟机栈(线程运行的内存空间),是线程私有的,其内部保存一个个的栈帧(stack Frame) ,对应着一次次的Java方法调用。
栈帧:每个方法运行时需要的内存,包含参数、局部变量、返回值等
活动栈帧:对应着正在执行的那个方法
在这里插入图片描述
(查看大图的方式:鼠标左键往右拖)
涉及问题:1、垃圾回收是否涉及栈内存
不会,因为栈帧对应的是方法的执行,每次执行完都释放了;
2、栈内存分配的越大越好吗
不是,栈是线程运行的内存,但是物理内存是固定的,这样就会栈内存越大,线程越少;
3、局部变量是否安全
线程安全主要是看该变量是否是共享的,后续在多线程文章中说明

栈内存溢出

1、栈帧过多导致栈内存溢出(无线递归、套娃)
2、栈帧过大导致内存溢出

线程运行诊断

1、cpu占用过多
查看问题步骤:1、用top定位哪个进程对cpu占用高
2、ps -H -eo pid,tid,%cpu|grep 进程id(用ps命令进一步查看哪个线程引起的cpu占用过高)
3、jstack 进程id,根据线程id找到有问题的线程,进一步定位问题代码

2、程序运行长时间无反应(死锁,后续线程中说明)

本地方法栈

本地方法栈的作用和虚拟机栈类似,主要作用是为本地方法的调用提供内存空间

heap 堆
通过new关键字,创建对象都会使用堆内存
特点

1、它是线程共享的,堆中对象都需要考虑线程安全问题
2、有垃圾回收机制

堆内存溢出

报的错误是:java.lang.OutOfMemoryError: Java heap space
有人说堆内存有垃圾回收机制为啥还会内存溢出,其实是使用的对象一直未释放,导致溢出。就像调侃的一样:垃圾回收也挡不住代码的垃圾;

堆内存诊断

在这里插入图片描述
输入jvisualvm 命令后,出现监控页面在这里插入图片描述
我们可以选择左边的进程点击查看内存占用情况 可以选择堆dump 进一步分析怎样导致堆内存溢出的在这里插入图片描述
鸣谢哔哩哔哩上黑马程序员的视频;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值