首页 > 其他分享 >JVM快速入门

JVM快速入门

时间:2023-05-08 22:24:05浏览次数:28  
标签:入门 本地 快速 虚拟机 线程 内存 JVM 串池 方法

内存结构

1.程序计数器

1.1.定义

Program Counter Register 程序计数器(寄存器)

1.2.作用

记住下一条jvm指令的执行地址

1.3.特点

  • 是线程私有的
  • 不会存在内存溢出

2.虚拟机栈

2.1.定义

Java Virtual Machine Stacks(Java虚拟机栈)

  • 每个线程运行时所需要的内存,称为虚拟机栈
  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能由一个活动栈帧,对应着当前正在执行的那个方法

问题辨析

  1. 垃圾回收是否涉及栈内存?
    否,栈内存是由一次次的方法调用产生的栈帧内存,栈帧内存在每一次方法调用结束后都会被弹出栈,会被自动的回收掉,所以不需要垃圾回收来管理栈内存
  2. 栈内存分配越大越好吗?
    不是,物理内存的大小是一定的,假设总共的物理内存是500M,如果每个线程限制1M内存,那么理论上可以由500个线程同时运行;如果每个线程限制2M内存,那么理论上只能同时运行250个线程;
  3. 方法内的局部变量是否线程安全?
  • 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的;
  • 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全;

2.2.栈内存溢出

  • 栈帧过多导致栈内存溢出(例如:方法递归调用未使用正确的终止条件)
    java.lang.StackOverflowError
    -Xss命令设置栈内存大小(-Xss256k)
  • 栈帧过大导致栈内存溢出

2.3.线程运行诊断

案例1:cpu占用过多
定位

  • 用top定位哪个进程对cpu的占用过高(获取PID:进程编号)

  • ps H -eo pid,tid,%cpu (用ps命令进一步定位是哪个线程引起的cpu占用过高)

已知进程编号可根据进程编号进行筛选
ps H -eo pid,tid,%cpu | grep 进程id

  • jstack 进程id
    可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行数

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

  • jstack 进程id

3.本地方法栈

  • Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。
  • 本地方法栈允许被实现成固定或者是可动态扩展的内存大小。如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常;如果本地方法可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将抛出一个outofMemoryError异常。
  • 本地方法是使用C语言实现的,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法库。
  • 当某个线程调用一个本地方法时,它就进入了一个全新的并且不受虚拟机限制的世界,它和虚拟机拥有同样的权限。本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区,它甚至可以直接使用本地处理器中的寄存器,直接从本地内存的堆中分配任意数量的内存。
  • 不是所有的JVM都支持本地方法,因为Java虚拟机规范没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。在Hotspot JVM中,直接将本地方法栈与虚拟机栈合二为一

4.堆

4.1.定义

Heap堆

  • 通过new关键字,创建对象都会使用堆内存
    特点
  • 它是线程共享的,堆中对象都需要考虑线程安全的问题
  • 有垃圾回收机制

4.2.堆内存溢出

java.lang.OutOfMemoryError
-Xmx命令可以设置堆空间的最大值(例如:-Xmx8m)

4.3.堆内存诊断

1.jps工具

  • 查看当前系统中由哪些java进程
    jps

2.jmap工具

  • 查看堆内存占用情况
    jmap -heap 18756

3.jconsole工具

  • 图形界面的,多功能的检测工具,可以连续监测

案例

  • 垃圾回收后,内存占用仍然很高

jvisualvm

5.方法区

5.1.定义

  • 方法区((Method Area)与Java堆一样,是各个线程共享的内存区域。
  • 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。
  • 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
  • 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误: java.lang.outOfMemoryError
  • 关闭JVM就会释放这个区域的内存。

5.2.组成

5.3.方法区内存溢出

  • 1.8以前会导致永久代内存溢出
    -XX:MaxPermSize=8m 设置永久代最大内存
    永久代内存溢出:java.lang.OutOfMemoryError:Metaspace:PermGen space
  • 1.8以后会导致元空间内存溢出
    -XX:MaxMatespaceSize=8m 设置最大元空间内存
    元空间内存溢出:java.lang.OutOfMemoryError:Metaspace

场景

  • spring
  • mybatis

5.4.运行时常量池

二进制字节码(类基本信息,常量池,类方法定义,包含了虚拟机指令)

  • 常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息
  • 运行时常量池,常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变成真实地址

5.5.StringTable

特性

  • 常量池中的字符串仅是符号,第一次用到时才变为对象
  • 利用串池的机制,来避免重复创建字符串对象
  • 字符串常量拼接的原理是编译期优化
  • 字符串常量拼接的原理是编译期优化
  • 可以使用intern方法,主动将串池中还没有的字符串对象放入串池
    • jdk1.7以后将字符串对象尝试放入串池,如果有则不会放入,如果没有则放入串池,会把串池中的对象返回
    • jdk1.7以前将字符串对象尝试放入串池,如果有则不会放入,如果没有会把对象赋值一份,放入串池,会把串池中的对象返回

位置

标签:入门,本地,快速,虚拟机,线程,内存,JVM,串池,方法
From: https://www.cnblogs.com/hss945/p/17375810.html

相关文章

  • Ansible快速入门(下)
    6.Ansible常用模块ansible有着诸多的模块,虽然模块众多,但最为常用的模块也就20-30个左右;6.1command模块功能:在远程主机执行Shell命令;此为默认模块,可忽略-m选项;注意:不支持管道命令|参数选项含义chdirchdir/opt执行ansible时,切换到指定的目录creates......
  • CodeForces - 618A Slime Combining (快速幂)
    CodeForces-618ASlimeCombiningTimeLimit: 2000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uSubmit StatusDescriptionYourfriendrecentlygaveyousomeslimesforyourbirthday.Youhave n slimesallinitiallywithvalue 1.Youare......
  • Java 中的机器学习正在加速图像处理 Java 开发人员可以使用预训练的机器学习模型快速
    来源: https://www.infoworld.com/article/3601711/machine-learning-in-java-is-speeding-image-processing.html 近年来,人们对机器学习的兴趣稳步增长。具体来说,企业现在在各种用例中使用机器学习进行图像识别。在 汽车行业、 医疗保健、 安全、 零售、 仓库中的自动化......
  • Windows、Linux快速排查系统是否被黑
    一、Windows1.存在隐藏用户或异常用户以Windows为例,右键计算机->管理->查看本地用户和组,如果用户或用户组带有$符号,说明该用户/用户组被隐藏,很有可能被黑了。如下截图    2.异常进程通过任务管理器查看是否存在异常进程,比如phpstudy被黑后可能存在12345.exe这......
  • python快速直白入门(半新手向,老手复习向)
    主用python做项目有一段时间,这次简单总结学习下。为后面的项目编写,进行一次基础知识的查缺补漏、1、变量名和数据类型"""变量名,只能由"数字、大小写字母、_"组成,且不能以数字开头"""#整数int#hashable,不可变对象a=5#浮点数float#hashable,不可变对象a1=3......
  • 线程的五种状态 jvm 看100%cpu, 是堆内存还是元空间还是gc的效率过低,
        ......
  • JAVA快速开发框架 一键生成表单模板代码
    从计算机诞生开始,虽然编程的形式随着硬件及软件的不断进步而不停迭代,但是从事计算机技术行业的人员始终与编写代码的任务紧密联系在一起。因此如何提高软件开发的效率和质量,一直是软件工程领域的重要问题之一。这一方面是由于在不同软件开发过程中存在大量相似代码复用的情况,多次......
  • JAVA快速开发框架 一键生成表单模板代码
    从计算机诞生开始,虽然编程的形式随着硬件及软件的不断进步而不停迭代,但是从事计算机技术行业的人员始终与编写代码的任务紧密联系在一起。因此如何提高软件开发的效率和质量,一直是软件工程领域的重要问题之一。这一方面是由于在不同软件开发过程中存在大量相似代码复用的情况,多次编......
  • 【编程入门】应用市场(NodeJS版)
    背景前面已输出多个系列:《十余种编程语言做个计算器》《十余种编程语言写2048小游戏》《17种编程语言+10种排序算法》《十余种编程语言写博客系统》《十余种编程语言写云笔记》《N种编程语言做个记事本》目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学......
  • 一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队
    作者:京东物流覃玉杰1.pie简介责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加CodeReview的成本......