首页 / 知识
JVM内存结构和Java内存模型别再傻傻分不清了
2023-04-11 16:24:00

JVM内存结构
JVM构成
说到JVM内存结构,就不会只是说内存结构的5个分区,而是会延展到整个JVM相关的问题,所以先了解下JVM的构成。
Java源代码编译成Java Class文件后通过类加载器ClassLoader加载到JVM中
类存放在方法区中
类创建的对象存放在堆中
堆中对象的调用方法时会使用到虚拟机栈,本地方法栈,程序计数器
方法执行时每行代码由解释器逐行执行
热点代码由JIT编译器即时编译
垃圾回收机制回收堆中资源
和操作系统打交道需要调用本地方法接口
JVM内存结构
程序计数器
(通过移位寄存器实现)
程序计数器是线程私有的,每个线程单独持有一个程序计数器
程序计数器不会内存溢出
虚拟机栈
栈:线程运行需要的内存空间
栈帧:每一个方法运行需要的内存(包括参数,局部变量,返回地址等信息)
每个线程只有一 个活动栈帧(栈顶的栈帧),对应着正在执行的代码
常见问题解析
垃圾回收是否涉及栈内存:不涉及,垃圾回收只涉及堆内存
栈内存分配越大越好吗:内存一定时,栈内存越大,线程数就越少,所以不应该过大
方法内的局部变量是否是线程安全的:
普通局部变量是安全的
静态的局部变量是不安全的
对象类型的局部变量被返回了是不安全的
基本数据类型局部变量被返回时安全的
参数传入对象类型变量是不安全的
参数传入基本数据类型变量时安全的
栈内存溢出(StackOverflowError)
栈帧过多
如递归调用没有正确设置结束条件
栈帧过大
json数据转换 对象嵌套对象 (用户类有部门类属性,部门类由用户类属性)
线程运行诊断
CPU占用过高(定位问题)
‘top’命令获取进程编号,查找占用高的进程
‘ps H -eo pid,tid,%cpu | grep 进程号’ 命令获取线程的进程id,线程id,cpu占用
将查看到的占用高的线程的线程号转化成16进制的数 :如6626->19E2
‘ jstack 进程id ’获取进程栈信息, 查找‘nid=0X19E2’的线程
问题线程的最开始‘#数字’表示出现问题的行数,回到代码查看
程序运行很长时间没有结果(死锁问题)
‘ jstack 进程id ’获取进程栈信息
查看最后20行左右有无‘Fount one Java-level deadlock’
查看下面的死锁的详细信息描述和问题定位
回到代码中定位代码进行解决
本地方法栈
本地方法栈为虚拟机使用到的 Native 方法服务
Native 方法是 Java 通过 JNI 直接调用本地 C/C++ 库,可以认为是 Native 方法相当于 C/C++ 暴露给 Java 的一个接口
如notify,hashcode,wait等都是native方法
堆
通过new关键字创建的对象都会使用堆内存
堆是线程共享的
堆中有垃圾回收机制
堆内存溢出(OutOfMemoryError)
死循环创建对象
堆内存诊断
命令行方式
‘jps’获取运行进程号
‘jmap -heap 进程号’查看当前时刻的堆内存信息
jconsole
命令行输入jconsole打开可视化的界面连接上进程
可视化的检测连续的堆内存信息
jvisualvm
命令行输入jvisualvm打开可视化界面选择进程
可视化的查看堆内存信息
|
最新内容
相关内容
python如何去空格和回车?
python如何去空格和回车?,培训,空格,方法,字符串,两端,以上,更多,内容,python去掉空格和回车的方法:1、使用strip()、lstrip()、rstrip()等机器学习用java还是python?
机器学习用java还是python?,分析,环境,数据,培训,发展,机器,结果,控制台,生态环境,有用,机器学习用python更合适。机器学习不需要面向对象,不python如何让程序暂停执行和继续执
python如何让程序暂停执行和继续执行?,暂停,培训,程序,继续,空格键,函数,以上,操作,方法,更多,python让程序继续执行的方法:一、使用到的函数Python和人工智能的关系
Python和人工智能的关系,人工智能,支柱,培训,设计,原因,语言,关系,地利,易学,原型,其实,简单来说,Python是最适合人工智能开发的编程语言。原因python函数里面形参和实参一样吗?
python函数里面形参和实参一样吗?,培训,函数,参数,里面,变量,实际,形式,全称,示例,后面,python函数里面形参和实参不一样。形参全称是形式参python如何控制内存
python如何控制内存,名称,情况,系统,定期,管理,数字,数据,培训,对象,内存,python控制内存的方法:一、对象的引用计数机制二、垃圾回收机制三、python如何取余和取商?
python如何取余和取商?,培训,余数,示例,函数,以上,结果,方法,更多,内容,python取余和取商的方法:1、使用“/”求取两数相除的商、%求取两数相python和php学哪个做web开发好
python和php学哪个做web开发好,数据,较大,技术,培训,代码,市场,人工智能,行业,份额,网站,不少打算学编程的学生,想从事web开发行业,但是对于webPython静态函数和普通方法的区别
Python静态函数和普通方法的区别,培训,方法,静态,区别,实例,函数,属性,结果,例子,下面,下面通过一个例子,讲解Python静态函数、普通方法、类方学python需要java吗?
学python需要java吗?,代码,时间,人工智能,数据,分析,美的,手机,对比,培训,效率,学Python不一定要学Java,先学好Python没,入门了,之后学习其他语python类对象和实例对象是一样的吗
python类对象和实例对象是一样的吗,地址,概念,下来,数据,培训,实例,对象,方法,属性,变量,python面向对象最重要的概念就是类(Class)和实例(In转java还是python?
转java还是python?,人工智能,数据,行业,培训,生产,产业,技术,平台,风险,生态,从目前IT行业的人才需求上来看,如果是应用级开发,那么掌握Java语