jvm学习

什么是 JVM ?
定义: Java Virtual Machine - java 程序的运行环境( java 二进制字节码的运行环境)
好处:
  • 一次编写,到处运行
  • 自动内存管理,垃圾回收功能
  • 数组下标越界检查
  • 多态
比较: jvm jre jdk
java程序的执行过程:java源码---编译---->java字节码----解释器----->机器码(交给cpu执行)
 程序计数器:
程序计数器(寄存器)
作用,是记住下一条 jvm 指令的执行地址
特点 :是每个线程私有的 ,不会存在内存溢出
虚拟机栈:

定义:每个线程运行时所需要的内存,称为虚拟机栈。每个栈由多个栈帧组成,对应每次方法调用时的内存空间,每个线程只能有一个活动栈,对应着当前正在执行的方法。

问题:

        1.栈内存是越大越好吗?-Xss1M

                答:栈的内存越大,同时运行的线程越少。

        2.方法内的局部变量是否线程安全。

                答:如果方法内的局部变量没有逃离方法的作用范围,他是线程安全的(引用对象)

        3.static int x=0;属于静态全局变量,不是线程安全的,是多个线程共享的

栈内存溢出:

        栈帧过多(方法递归调用)

        栈帧过大:

将java对象转为json对象时导致栈帧过大,转换时员工内有部门,部门内有员工,无线递归,导致栈帧不断增大,导致栈内存溢出。

线程诊断:

案例一:cpu占用过多。

案例二:等了很久没有得到结果,可能发生了线程死锁。

本地方法栈:

不是由java代码编写的方法所占用的内存空间(c/c++),被native修饰的方法。

堆:

通过new关键字,创建的对象都会使用堆内存,它是线程共享的,有垃圾回收机制。

堆内存诊断:

1.jps工具:查看当前系统中有哪些java进程(jps)

2.jmap工具:查看堆内存占用情况(jmap -heap 进程id)

3.jconsole工具:图形界面的,多功能的监测工具,可以连续监测。

案例:

堆内存诊断:jvisualjvm(抓取堆内存快照进行分析)

方法区:(规范)

线程共享,存储类的相关信息,成员方法,构造器方法,成员方法,虚拟机启动时被创建,逻辑上属于堆的一部分,有不同的实现方式。jdk1.8之前永久代(实现),jdk1.8以后元空间。也会导致内存溢出。

方法区内存溢出:

场景:使用spring,mybatis框架时会导入大量的类,就可能导致方法区内存溢出, 

 

 常量池:

常量池就是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息。

运行时常量池,常量池是*.class文件中的,当该类被加载,他的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址。

java -v helloworld.java反编译。

StringTable:

StringTable是hashTable结构,不能扩容。

 StringTable特性:

  • 常量池中的字符串仅是符号,第一次用到时才变为对象
  • 利用串池的机制来避免重复创建字符串对象
  • 字符串变量的拼接原理是StringBuilder
  • 字符串常量的拼接原理是编译器优化
  • StringTable也会出发垃圾回收
  • 可以使用intern方法,主动将串池中还没有的字符串对象放入串池。

 StringTable性能调优:

  • 调整 -XX:StringTableSize=桶个数,桶的个数越多hash冲突越低。
  • 考虑将字符串对象入池,可以减少内存的占用。

直接内存:
  • 常见于NIO操作时,用于数据缓冲区
  • 分配回收成本较高,但读写性能高
  • 不受jvm内存回收管理

相关推荐

  1. 学习JVM

    2024-03-22 16:30:09       40 阅读
  2. <span style='color:red;'>JVM</span><span style='color:red;'>学习</span>

    JVM学习

    2024-03-22 16:30:09      35 阅读
  3. <span style='color:red;'>JVM</span><span style='color:red;'>学习</span>

    JVM学习

    2024-03-22 16:30:09      27 阅读
  4. <span style='color:red;'>jvm</span><span style='color:red;'>学习</span>

    jvm学习

    2024-03-22 16:30:09      14 阅读
  5. <span style='color:red;'>JVM</span><span style='color:red;'>学习</span>

    JVM学习

    2024-03-22 16:30:09      19 阅读
  6. <span style='color:red;'>JVM</span><span style='color:red;'>学习</span>

    JVM学习

    2024-03-22 16:30:09      9 阅读
  7. 学习记录之JVM

    2024-03-22 16:30:09       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 16:30:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 16:30:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 16:30:09       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 16:30:09       20 阅读

热门阅读

  1. 蓝桥杯:Python基础学习一

    2024-03-22 16:30:09       15 阅读
  2. C# 读取指定文件夹

    2024-03-22 16:30:09       17 阅读
  3. C# 读取txt文本所有行

    2024-03-22 16:30:09       18 阅读
  4. 如何使用Python自动化整理你的文件系统

    2024-03-22 16:30:09       20 阅读
  5. C++(4): std::ofstream的使用

    2024-03-22 16:30:09       17 阅读
  6. 【数据库】数据库语言

    2024-03-22 16:30:09       18 阅读