• jvm启动


    1. 首先使用 Java 命令启动JVM
    2. 其次进行JVM配置的装载——根据当前路径和系统的版本去寻找jvm.cfg文件,装载配置。

                 每种需要java虚拟机的软件,都会带一个jvm.cfg。然后jvm.cfg的内容是不同的。

    #
    # 
    # 
    # Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
    # ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
    #
    #
    # List of JVMs that can be used as an option to java, javac, etc.
    # Order is important -- first in this list is the default JVM.
    # NOTE that this both this file and its format are UNSUPPORTED and
    # WILL GO AWAY in a future release.
    #
    # You may also select a JVM in an arbitrary location with the
    # "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
    # and may not be available in a future release.
    #
    -server KNOWN
    -client IGNORE

      idea自带的jvm.cfg

    -server KNOWN
    -client ALIASED_TO -server

    3 .之后会根据加载的配置去寻找JVM.dll文件——JVM的主要实现文件。

    4 。再后,通过该文件去初始化JVM,并获得相关的接口,比如JNIEnv接口,通过该接口实现findClass操作。

    5.最后,通过相关接口(JNIEnv……),找到程序里的main方法,即可进入程序……

    二:jvm结构图

     6:逃逸分析假设在方法体内,声明了一个局部变量,且该变量在方法执行生命周期内未发生逃逸(在方法体内,未将引用暴露给外面)。按照JVM内存分配机制,首先会在堆里创建变量类的实例,然后将返回的对象指针压入调用栈,继续执行。这是优化前,JVM的处理方式。

      逃逸分析优化 – 栈上分配,优化原理:JVM分析找到未逃逸的变量(在方法体内,未将引用暴露给外面),将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量也被回收。这是优化后的处理方式,对比可以看出,主要区别在栈空间直接作为临时对象的存储介质。从而减少了临时对象在堆内的分配数量。

     记住一个结论:启用逃逸分析的运行性能6倍于未启用逃逸分析的程序。逃逸分析是JVM层面的工作,JVM做了逃逸分析,这样没有逃逸的对象就可以被优化,从而减少堆的大小并减少GC。如果JVM没有加逃逸分析,就算自己优化了代码,也不会有效果。

      JVM中启用逃逸分析需要安装jdk1.6.0_14+版本,运行java时传递jvm参数  -XX:+DoEscapeAnalysis,取消逃逸分析把+改为-。

    7:

      对Java栈——栈上分配优化的小结:

    • 必须是小对象(一般几十个bytes),且必须是在没有逃逸的情况下,如果JVM使用了逃逸分析优化,则该小对象可以直接分配在栈上,因为栈的空间不大(一般也就到1m封顶了),更没有堆大。
    • 直接分配在栈上,方法调用完毕,Java栈帧就立即被移除,故内存可以自动回收,减轻GC压力。
    • 大对象(栈的空间不允许)或者逃逸的对象无法在栈上分配(即使启动了JVM的逃逸分析优化,且因为Java栈是线程私有的,不共享,局部对象变量被其他线程或者方法引用了肯定不能在栈分配内存)

    8:打印日志分析

    8.1、GC 表示垃圾回收,其中DefNew:表示GC发生的区域,这里表示新生代; 6972K->431K(9216K)表示GC前该内存区域已经使用的容量为6972K,回收后该区域使用的容量为431K,该内存的总量为9216K; 6972K->6575K(19456K)表示GC前java堆已经使用的容量为6972K,回收后java堆使用的内存为6575K,java堆的总容量为19456K。

    8.2、def new generation表示堆内存的新生代,域包括Eden空间(一般对象生成都存放这个区)和Survivor空间。

    8.3、tenured generation表示堆内存的老年代。

    8.4、compacting perm gen表示非堆内存也就是永久区,一般存放类加载的信息。 

    参考:https://yq.aliyun.com/articles/49201

  • 相关阅读:
    Windows安装node.js
    02ARM体系结构
    01ARM介绍
    01软件过程模型
    创建一个JavaWeb工程
    python之面向对象01
    python学生管理系统
    python文件、文件夹的相关操作
    python文件的定位读写
    python文件的写入与备份
  • 原文地址:https://www.cnblogs.com/liyafei/p/8808232.html
Copyright © 2020-2023  润新知