首页 > 其他 > 详细

JVM体系结构及优化

时间:2019-09-01 01:08:44      阅读:105      评论:0      收藏:0      [点我收藏+]

JVM体系结构     方法区,类加载器,堆,Java栈,本地方法栈,程序计数器,执行引擎,PC寄存器。

技术分享图片

类加载器:

 技术分享图片

 

• 启动类加载器 (Bootstrap Bootstrap)

• 扩展类加载器 (Extension Extension Extension)Java Java
• 应用程序类加载器应用程序类加载器 应用程序类加载器 (AppClassLoader AppClassLoader AppClassLoader ) Java
      也叫系统类加载器,加载当前应用的classpath的所有类的所有类
• 用户自定义加载器JJava.lang.ClassLoader的子类,用户可自定义

PC寄存器

  • 程序计数器是一块较小的内存空间 程序计数器是一块较小的内存空间,当前线程所执行的字节码是当前线程所执行的字节码是当前线程所执行的字节码的行号指示器
  • 程序计算器处于线独占区
  • 如果线程执行的是 java方法,记录的是正在执行虚拟的字节码指令的地址,如果是native方法,这个计数器的值为undefined

栈区:

 

  • 栈也叫内存 ,主管 Java 程序的运行 ,是在线程创建时创建 ,它的生命期是跟随线程,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题 ,只要线程一结束该栈就Over 生命周期和线程一致,是线程私有的 。8种基本类型的变 量+对象的引用变量 +实例方法都是在函数的栈内存中分配

栈存储什么 ?

  • 局部变量表 :输入参数和出以及方法内的变量 类型;局部表在编译期间完成分配,当进入一个方法时这帧中多少内存是固定的
  • 栈操作( Operand Stack ):记录出栈、入的操作;
  • 动态链接
  • 方法出口
  • 栈溢出 StackOverflowError,OutOfMemory

方法区:

Method Area 方法区是被所有线程共享 ,所有字段和方法节码 ,以及一些特殊方法如构造函数 ,接口代码也在此定义 。简单说 ,所有定义的方法信息都保存在该区域 ,此区属于共享间类信息 类的版本字段方法接口

  • 静态变量
  • 常量
  • 类信息 (构造方法 /接口定义 )
  • 运行时常量池

方法区与永久代

方法区永久存储区是一个常驻内域,用于放 JDK 自身所携带的 Class,Interface 的元数据,也就是说它存储运行环境必须类信息被装载进此区域不会被垃圾回收器掉的,关闭JVM才会释放此区域所占用的内存。如果出现java.lang.OutOfMemoryError:PermGen space,说明是Java 虚拟机对永久代Perm内存设置不够。一般出现这种情况,都是程序启动需要加载大量的第三方jar包。

  • Jdk1.6 及之前: 有永久代 , 常量池 1.6 在方法区
  • Jdk1.7 : 有永久代,但已经逐步“去”,常量池 1.7 在堆
  • Jdk1.8 及之后: 无永久代,常量池 1.8 在元空间

常量池问题<待续>

 堆:

一个 JVM 实例只存在一个堆内,堆内存的大小是可以调节的.类加载器读取了文件后,需要把类,方法,常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器,堆内存分为三部:

  • Permanent Space Permanent Space  新生区   Young/NewYoung
  • Tenure generation space 养老区 Old/ Tenure Old
  • Permanet  Space 永久区   Perm

技术分享图片

 

JVM体系结构及优化

原文:https://www.cnblogs.com/wongandy/p/11440895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!