JVM性能调优之基础篇

1.前序

大家都所认知的java程序是一次编译到处运行机制,为什么能到处运行呢?因为java经过javac编译成class文件,然后交给Java虚拟机来运行;

2.java的class文件如何交给java虚拟机?

经过类加载机制

2.1 装载

  1. 通过classloader来寻找所有class的绝对路径
    从自己需要加载的类开始(自己的类路径)->app ClassLoader(加载指定包以及java.class.path路径下的包)->extendClassLoader(扩展类)->bootstarp ClassLoader(根路径rt.jar);
    利用了双亲委派机制,加载自己类路径下的包,首先要加载父类地下的包,看存不存在,一次类推。为了避免包冲突;
  2. 加载类文件信息交给jvm
    类字节流静态存储->jvm中的方法区
  3. 类文件所对应的class文件交给JVM
    存放在堆中

2.2 链接

  1. 验证
    保证被加载类的正确性
  2. 准备
    要为类的静态变两分配内存空间,并将其值初始化默认值
  3. 解析
    将类中的符号引用转化为直接引用,相当于将编译后的符号赋予上所对应的地址,用来调用;

2.3 初始化

为静态变量赋予真正的值;

3.jvm的了解

3.1 方法区

所有线程所共享的区域,且整个虚拟机中只有一个,生命周期和jvm一致;所存放java中静态变量的值、常量值、类信息,还被分配了 运行时常量池;当类信息毫无节制的放入时,会出现OMM(OutOfMemoryError);线程非安全

3.2 堆

所有线程共享的区域,且整个虚拟机中只有一个,生命周期和jvm一致,哟用来存放对象或者数组,也是线程非安全的;当无节制的创建对象时,会出现堆内存不足,会抛出OMM(OutOfMemoryError);

3.3 java虚拟机栈

JDK1.7–PermSpace–永久代
JDK1.8–Meta----->元空间
线程私有的工作空间,而且每一个线程有会有一个java虚拟机栈,主要是调用方法的标识,在调用方法时会进栈,方法里套用方法还会进栈;每个方法被调用了 ,就会创建一个栈帧;当栈内村不足时,会出现StackOverflowError;简称栈溢出

3.4 本地方法栈

略,有关于c++层面的调用,目前不用去了解;

3.5 程序计数器

每个线程会对应一个程序技术器,因为当线程运行到一半时,会出现cpu的切换,需要计数器来做一个标识,为了记住线程运行的标识;

发布了40 篇原创文章 · 获赞 4 · 访问量 652
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览