jvm相关

java程序(编译)——class文件——jvm解释——转化为不同平台的交易码——execute()

主要文件:jvm.cfg(jre/lib/amd64/)

    与jvm.dll(jre/bin/server/)jvm的主要实现,初始化jvm,并且获取JNI(Java Native Interface)接口

内存空间:方法区、堆、栈、本地方法栈

方法区:各线程共享区,存放类信息、常量、静态变量

堆:类的实例  OutOfMemory

栈:线程私有区域  StackOverflow

本地方法栈:调用本地方法库,实现与硬件及OS交互

PC寄存器:执行内容及顺序

执行引擎:根据PC寄存器调配的指令顺序,依次执行程序指令

内存模型:主内存、工作内存

可见性:volatile

  1、线程1工作内存中变量更新强制写入主内存

     2、线程2工作内存变量失效,重读

重排序:

  源代码——编译器优化重排——指令级并行重排——内存系统重排——最终执行的指令序列

 

垃圾回收:stop the world

  引用计数:  java未采用

    1、频繁的计数影响性能

    2、无法处理循环引用

  标记清除:

    标记:遍历所有的GC Roots,将其可达对象标记为存活

    清除:遍历堆中所有对象,未标记对象清除

    1、遍历所有内存,‘stop the world’过长,吞吐量低

    2、清除对象内存不连续

  标记压缩:标记清除+压缩:解决内存不连续

  复制:内存一分为二,将正在使用的存活对象复制一份,删除之

    1、存活对象多时不适用

    2、内存空间占用成本高

 

GC:    jdk1.8元数据区(内存)——(1.7永久区)

  eden——S0——S1——tenured

      from      to

  串行收集器Serial:使用单线程进行垃圾回收

    新生代:复制   老年代:标记压缩

    -XX:+UseSerialGC

  并行收集器:

    ParNew:新生代并发回收,老年代串行回收,算法同串行

      -XX:UseParNewGC

      -XX:ParallelGCThreads 指定线程数,一般等同于CPU核数

    Parallel:

      1、同ParNew,更重视吞吐量,性能更优

        -XX:UseParallelGC

      2、对新生代及老年代均并行回收

        -XX:UseParallelOldGC

  CMS : Current Make Sweep 并发标记清除

    可与程序并发执行,只适用老年代

    -XX:UseConcMarkSweepGC

    -XX:ConcGCThreads设置线程数

    -XX:CMSInitiatingOccupancyFraction CMS回收阈值,默认68(即老年代68%回收)

    注意:不能与Parallel Scavenge一起工作,只能选择ParNew或Serial

    初始标记——并发标记——重新标记——清除

    1、减少停顿时间

    2、回收不彻底

    3、吞吐量大

  G1:Garbage First  分区算法

    将堆划分为互相独立的区块,用相对较少的时间清理垃圾最多的区块

    -XX:USeG1GC

    1、回收时减小了内存碎片的产生

    2、适用于新生代+老年代

 

类加载器:

类加载(加载——连接(验证——准备——解析)——初始化)——使用——卸载

加载:1、通过.class的路径读取到二进制流

   2、二进制流元数据(类型、常量等)载入方法区

      3、在堆中生成对应的java.lang.Class对象

连接:

  1、验证:判断class文件合法性

  2、准备:分配内存

  3、解析:将符号引用替换为直接引用

初始化:执行类的构造方法、static相关

 

 

 

性能工具:jVisualVM.exe

    MemoryAnalyzer.exe

优化:本质上是减少GC的次数

  如果是频繁创建对象的引用,可↑新生代

  常量较多:↑持久代

  单例较多:↑老年代  eg:spring

 

posted @ 2018-09-06 10:34  zsxiang  阅读(108)  评论(0编辑  收藏  举报