ICode9

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

jvm学习总结

2021-06-10 16:31:33  阅读:149  来源: 互联网

标签:总结 常量 虚拟机 永久 学习 线程 内存 jvm


参考文档:

https://csp1999.blog.csdn.net/article/details/116903563

https://nyimac.gitee.io/2020/07/03/JVM%E5%AD%A6%E4%B9%A0/

https://blog.csdn.net/weixin_50280576/article/details/113742011

 

jvm 定义:

Java 虚拟机,Java程序的运行环境

jvm的特点:

1、可以在不同平台上运行

2、内存管理,垃圾回收机制

 

jvm 的内存结构

方法区,堆,虚拟机栈,程序计数器,本地方法栈

1、程序计数器

  • 保存下一条所要执行jvm指令的地址
  • 当解释器把一条指令转换为机器码时,回向程序计数器存放下一条所要执行jvm指令的地址
  • 程序计数器实际上是通过寄存器实现
  • 程序计数器是线程私有的

2、虚拟机栈

  • 每个线程都会有一个虚拟机栈,虚拟机栈是线程运行时所需要的的内存空间
  • 虚拟机栈由多个栈帧组成,栈帧是方法调用时所占用的内存
  • 每个线程都会有一个活动栈帧,对应当前执行的方法,方法执行是压入栈,执行完毕后弹出栈

虚拟机栈越大,可执行的线程数越少,支持的递归调用次数越多。

设置虚拟机栈大小的参数:-xss

cpu占用过高诊断

  1. top 命令 查看那个进程占用CPU过高
  2. ps -H eo pid tid | grep 进程id   查看那个线程占用CPU过高
  3. jstack 进程id    进一步定位源码行数,注意jstack查出来的线程id是十六进制的

3、堆

用来保存实例对象

属于线程共享区

堆内存的排查工具

  • jps 查看Java进程id
  • jmap -heap 进程id   查看堆内存的使用情况
  • jconsole 进程id    图形界面
  • jvisualvm

-xms  指定堆的初始值

-xmx  指定堆的最大值

4、方法区

  • Jdk 1.6 及之前:有永久代(静态变量存放在永久代上)、字符串常量池(1.6在方法区)
  • Jdk 1.7 :有永久代,但已经逐步 " 去永久代 ",字符串常量池、静态变量保存在堆中
  • dk 1.8 及之后: 无永久代,类型信息,字段,方法、常量池保存在本地内存的元空间。但静态变量、字符串常量池仍在堆中

字符串常量池1.7后保存在堆的原因:字符串常量池存在永久代,永久代要进行垃圾回收,full GC时才会进行,老年代空间不足是才会触发full GC。这样就导致了回收效率不高,永久代内存不足。放在堆中,可以及时回收内存

方法区大小的设置

jdk7及以前:

  • -XX:PermSize=100m(默认值是20.75M)
  • -XX:MaxPermSize=100m(32位机器默认是64M,64位机器模式是82M)

jdk1.8及以后:

  • -XX:MetaspaceSize=100m(windows下,默认约等于21M)
  • -XX:MaxMetaspaceSize=100m(默认是-1,即没有限制)

常量池与运行时常量池

  • 常量池就是一张表,jvm指令根据这张表找到要执行的类名、方法名、参数类型、字面量信息。
  • 运行时常量池,当类的class文件被加载到内存中时,常量池信息就会放入运行时常量池,并把里面的符号地址变成真实的内存地址。
  • 运行时常量池是方法区的一部分,常量池是class文件的一部分

串池(StringTable)

5、直接内存区

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

 

 

 

 

标签:总结,常量,虚拟机,永久,学习,线程,内存,jvm
来源: https://blog.csdn.net/u011476932/article/details/117568498

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

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

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

ICode9版权所有