jvm启动

  1. Java 命令启动JVM
  2. 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

JVM.dll文件——JVM的主要实现文件。

并获得相关的接口,比如JNIEnv接口,通过该接口实现findClass操作。

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

二:jvm结构图

jvm启动

 6:逃逸分析按照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:打印日志分析

jvm启动

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