字节码常用指令和语法
怎么使用idea查看字节码
使用视图-show bytecode功能可以查看字节码
常量池
#符号引用类的常量池,可以得到他们的定义在Constant pool部分
Constant pool:
#1 = Methodref #6.#15 // java/lang/Object."<init>"()V
#2 = Fieldref #16.#17 //
= String #18 // Hello World!
#4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #21 // Main
#6 = Class #22 // java/lang/Object
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 main
...
创建对象
看一个创建对象的字节码案例:
public class MyTest {
public static void main(String[] args) {
Object o = new Object();
}
}
0 new #2 <java/lang/Object>
3 dup
4 invokespecial #1 <java/lang/Object.<init> : ()V>
7 astore_1
8 return
new语句代表引用object常量池#2的创建方法。申请内存空间,还没初始化
dup是一个操作数栈管理指令,负责复制栈顶(注意,这个栈指的是操作数栈)一个或者两个数值并将复制值或双份的复制值重新压人栈顶。简单理解就是给操作数栈栈顶的元素弄了一个备份。
invokespecial调用#1的初始化元素,将Object进行初始化,如果构造函数有内容在此时执行。java编译器编译出来的字节码都会有invokespecial,通过其他方式产生的则不一定。
astore_1将o和new Object建立关联
JVM参数
-D、-X、-XX的区别
-D表示是JVM的标准选项,我们可以通过它设置系统属性
-X:可以输出有关非标准选项的帮助信息,例如-Xms和-Xmx
-XX:用于开发者调整JVM的行为、性能或输出调试信息等,有布尔值类型和带参数类型
布尔值类型可以使用+或-表示true或false,例如
-XX:-OmitStackTraceInFastThrow
为禁用JVM隐藏堆栈带参选项的一般需要设置相应值,例如
-XX:TreadStackSize=256k
常用的JVM参数
最大/最小内存、栈空间:三个最常用的调优选项,同时是本地调测控制内存的好帮手
-Xmx
和-Xms
:堆内存分配大小,当配置相同时,可以限制堆内存扩展,例如-Xmx8192m -Xms1024m
-Xss
:配置虚拟机栈设置单个线程栈的大小, 一般默认为512K~1024K,例如-Xss105k
-XX:MaxPermSize
:方法区分配内存大小-XX:+/-UseTLAB
:多线程并发申请内存场景,是否使用本地线程分配缓存-XX:FieldsAllocationStyle
:对象实例数据的存储策略,默认策略是将相同宽度的对象放到一起存放-XX:CompactFields
:对象实例数据存储时,允许长度短的对象在长的对象之间插空,默认true-XX:ThreadStackSize
:与-Xss参数功能一致-XX:PermSize
、-XX:MaxPermSize
:jdk8以前使用永久代,这两个参数配置永久代大小-XX:MaxMetaspaceSize
:jdk8用元空间代替永久代。配置元空间最大值,默认-1,即上限为内存-XX:MetaspaceSize
:jdk8指定元空间的初始空间大小,以字节为单位,达到该值会触发GC,同时收集器会对该值调整,如果释放了大量空间会降低该值,如果释放了很少空间,在不超过最大元空间上限的前提下适当提高。-XX:MinMetaspaceFreeRatio
:控制垃圾收集之后最小的元空间剩余容量百分比,控制垃圾回收频率-XX:MaxMetaspaceRatio
:用于控制垃圾回收后元空间剩余容量百分比。-XX:MaxDirectMemorySize
:指定直接内存容量上限,不指定默认与-Xmx一致-Xnoclassgc
:控制方法区的类是否能被回收-XX:+ThreadClassLoading
:product版虚拟机可用,查看类加载和卸载信息-XX:+TraceClassUnLoading
:FastDebug版虚拟机可用,也是查看类加载和卸载信息-XX:-OmitStackTraceInFastThrow
:jvm堆栈隐藏,这个参数默认打开,打开后报错多次的异常不输出堆栈,使用-XX:-可以关闭这个选项-XX:HeapDumpPath=/tmp
:系统内存输出
评论区