首页 > 其他 > 详细

JVM学习(一)

时间:2020-03-14 21:10:00      阅读:74      评论:0      收藏:0      [点我收藏+]

一、JVM体系结构图

技术分享图片

 

 

我们所谓的JVM调优就是调整 堆(heap),一定不会有垃圾的是栈(stack) 

二、类加载器 Class Loader

正向:new 反向:getClass()

反向获取类记载器:getClassLoader()

类的加载、连接和初始化

1、加载:查找并加载类的二进制数据

2、连接:

  • 验证:保证被加载的类的正确性
  • 准备:给类的静态(static)变量分配内存空间,赋值一个默认初始值
  • 解析:把类中的符号引用转换为直接引用

  把 Java 编译成 Class 的时候,虚拟机并不知道所引用的地址,助记符:符号引用 转化为真正的直接引用,找到对应的直接地址

3、初始化:给类的静态变量赋值,正确的值

JVM 参数:-XX:+TraceClassLoading //用于追踪类的加载信息并打印出来

final 常量在编译阶段的时候,会进入调用类的常量池,调用时不会触发常量所有类的初始化。但当一个常量的值并非编译期间可以明确,那这个值就不会被放到调用类的常量池中,调用时会触发常量所有类的初始化。

ClassLoader 分类

1、java 虚拟机自带的加载器

  • BootStrap  根加载器(加载系统包,JDK核心库中的类 rt.jar)
  • Ext     扩展类加载器(加载一些扩展jar包中的类)
  • Sys/App     系统(应用类)加载器 

2、用户自己定义的加载器

  • ClassLoader  只需要继承这个抽象类即可,自定义自己的类加载器,基本没用

JVM有机制保护自己的安全:顺序:BootStrap -> Ext -> App

双亲委派机制:一层层让父类去加载,如果顶层加载器不能加载,然后再向下类推

保护java的核心类不会被自己的定义的类替换

三、native 方法

native关键字,说明java的作用范围达不到,只能调用C语言库

JNI:java native interface(java本地方法接口)

四、程序计数器

五、方法区

method Area 方法区,是java 虚拟机规范定义的运行时数据区一致,和堆(heap)一样可以再线程之间共享

JDK1.7前:

永久代:用于存储一些虚拟机加载类的信息,空间有限,如果存满了:OutofMemoryError:PermGen

JDK1.8后:

彻底将永久代移除HotSpot JVM

信息会存入到Java Heap 或 Metaspcace(Native Heap)元空间

元空间就是方法区在 HotSpot JVM的实现

元空间和永久代的最大区别:元空间不在java虚拟机中,使用本地内存

-XX:MetasapceSize 10M  //设置元空间大小

如果元空间满了,OutofMemoryError:MetaSpace

六、栈 Stack

程序 = 数据结构 + 算法

栈和队列都是基本的数据结构

程序的运行就是压栈的过程

吃多了拉,上进下出,队列,喝多了吐,上进上出,栈

栈是管理程序运行的,栈的存取速度快,仅次于寄存器,栈的数据不可以共享

StackOverFlow : 栈溢出

栈里一定不会存在垃圾回收的问题,只要线程一旦结束,该栈就Over,生命周期和线程一致

 

JVM学习(一)

原文:https://www.cnblogs.com/xbflovetj/p/12458583.html

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