ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM知识点总结

2022-06-05 22:31:59  阅读:137  来源: 互联网

标签:总结 知识点 常量 虚拟机 串池 内存 JVM 线程 方法


什么是JVM

定义:Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)

好处:

一次编写,到处运行

自动内存管理,垃圾回收功能

数组下标越界检查

多态

比较:

JVM内存结构

 

 

程序计数器

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

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

特点:是线程私有的;不会存在内存溢出

虚拟机栈

Java Virtual Machine Stacks (Java 虚拟机栈)

参数:-Xss

定义:

每个线程运行时所需要的内存,称为虚拟机栈

每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

问题辨析

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

2. 栈内存分配越大越好吗?不是

3. 方法内的局部变量是否线程安全?

如果方法内局部变量没有逃离方法的作用范围,它是线程安全的

如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

栈内存溢出(Stack Overflow)

栈帧过多导致栈内存溢出

栈帧过大导致栈内存溢出

线程运行诊断

案例1: cpu 占用过多

定位

用top定位哪个进程对cpu的占用过高

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

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

本地方法栈

Java虚拟机栈用于管理Java方法的调用,本地方法栈用于管理本地方法(C或C++)的调用

Heap 堆

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

参数:-Xmx

特点

它是线程共享的,堆中对象都需要考虑线程安全的问题

有垃圾回收机制

堆内存溢出(OutOfMemory:Java heap space)

对象一直使用并占用越来越多内存

堆内存诊断

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

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

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

方法区

定义

线程共享

存储每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法

方法区域是在虚拟机启动时创建的

方法区域在逻辑上是堆的一部分

参数:-XX:MaxPermSize=8m;-XX:MaxMetaspaceSize=8m

1.6

 

1.8

 

方法区内存溢出

永久代内存溢出 java.lang.OutOfMemoryError: PermGen space

元空间内存溢出 java.lang.OutOfMemoryError: Metaspace *

运行时常量池

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

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

StringTable

常量池中的字符串仅是符号,第一次用到时才变为对象

利用串池的机制,来避免重复创建字符串对象

字符串变量拼接的原理是 StringBuilder (1.8)

字符串常量拼接的原理是编译期优化

可以使用 intern 方法,主动将串池中还没有的字符串对象放入串池

1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回

1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份, 放入串池, 会把串池中的对象返回

标签:总结,知识点,常量,虚拟机,串池,内存,JVM,线程,方法
来源: https://www.cnblogs.com/jpppp/p/16345378.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有