<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/doc/advance/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/doc/advance/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/doc/advance/bytecode/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/bytecode/</guid><description>&lt;!-- varibale -->
&lt;ul>
&lt;li>
&lt;h2 id="introbytecode">
 Intro(ByteCode)
 &lt;a class="anchor" href="#introbytecode">#&lt;/a>
&lt;/h2>
&lt;p>


 &lt;a href="https://github.com/xhsgg12302/knownledges/blob/master/docs/doc/advance/assert/Hello.class" rel="noopener" target="_blank">Hello.class&lt;/a>&lt;/p> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel left-panel"style="max-width: 55%; width: 55%;">
&lt;p class="tip"> 参考
&lt;br>


 &lt;a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1" rel="noopener" target="_blank">JDK8 JVM虚拟机实现规范 Chapter 4. The class File Format&lt;/a>，包括


 &lt;a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4" rel="noopener" target="_blank">常量池&lt;/a>数据结构
&lt;br>


 &lt;a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html" rel="noopener" target="_blank">JDK8 JVM虚拟机实现规范 Chapter 6. The Java Virtual Machine Instruction Set&lt;/a>
&lt;br>&lt;br>工具：
&lt;br>进制转换&lt;code>echo 'ibase=16;12'| bc&lt;/code>
&lt;br>十六进制转utf-8&lt;code>echo -n &amp;quot;6E756D&amp;quot; | xxd -r -p | iconv -f utf-8&lt;/code>&lt;/p>
&lt;p class="warn">下面为java源代码和class字节码。编译使用&lt;code>-g&lt;/code>参数，会包含 


 
 

 
 
 
 
 
 
 
 &lt;a href='../javastrace/#localvariabletable' rel="noopener" class="internal-link" data-src="../javastrace/#localvariabletable">&lt;em>&lt;strong>LocalVariableTable&lt;/strong>&lt;/em>&lt;/a> 。
&lt;br>&lt;br>用vim打开class文件&lt;code>vim -b Hello.class&lt;/code>。[不加&lt;code>-b&lt;/code>会在末尾追加&lt;code>0x0A&lt;/code>多一个字节]
&lt;br>并且使用xxd工具查看&lt;code>:%!xxd -u&lt;/code>;
&lt;br>&lt;br>右边为使用&lt;code>javap -v Hello.class&lt;/code>工具输出的字节码信息。&lt;/p>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">public class Hello { 
 private int num;
 public int foo() {
 return num;
 } 
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="shell" data-line="" class="language-shell line-numbers" style="max-height: none">&lt;code class="language-shell">00000000: CAFE BABE 0000 0034 0013 0A00 0400 0F09 .......4........
00000010: 0003 0010 0700 1107 0012 0100 036E 756D .............num
00000020: 0100 0149 0100 063C 696E 6974 3E01 0003 ...I...&amp;lt;init&amp;gt;...
00000030: 2829 5601 0004 436F 6465 0100 0F4C 696E ()V...Code...Lin
00000040: 654E 756D 6265 7254 6162 6C65 0100 0366 eNumberTable...f
00000050: 6F6F 0100 0328 2949 0100 0A53 6F75 7263 oo...()I...Sourc
00000060: 6546 696C 6501 000A 4865 6C6C 6F2E 6A61 eFile...Hello.ja
00000070: 7661 0C00 0700 080C 0005 0006 0100 0548 va.............H
00000080: 656C 6C6F 0100 106A 6176 612F 6C61 6E67 ello...java/lang
00000090: 2F4F 626A 6563 7400 2100 0300 0400 0000 /Object.!.......
000000a0: 0100 0200 0500 0600 0000 0200 0100 0700 ................
000000b0: 0800 0100 0900 0000 1D00 0100 0100 0000 ................
000000c0: 052A B700 01B1 0000 0001 000A 0000 0006 .*..............
000000d0: 0001 0000 0001 0001 000B 000C 0001 0009 ................
000000e0: 0000 001D 0001 0001 0000 0005 2AB4 0002 ............*...
000000f0: AC00 0000 0100 0A00 0000 0600 0100 0000 ................
00000100: 0400 0100 0D00 0000 0200 0E ...........
&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
 &lt;div class="docsify-example-panel right-panel"style="max-width: 45%; width: 45%;">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="shell" data-line="" class="language-shell line-numbers" style="max-height: none">&lt;code class="language-shell">Classfile /path/to/bytecode/Hello.class
Last modified 2024-3-6; size 267 bytes
MD5 checksum 4792914d35d8b3a70c01ee4fd462f512
Compiled from &amp;quot;Hello.java&amp;quot;
public class Hello
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #4.#15 // java/lang/Object.&amp;quot;&amp;lt;init&amp;gt;&amp;quot;:()V
#2 = Fieldref #3.#16 // Hello.num:I
#3 = Class #17 // Hello
#4 = Class #18 // java/lang/Object
#5 = Utf8 num
#6 = Utf8 I
#7 = Utf8 &amp;lt;init&amp;gt;
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 foo
#12 = Utf8 ()I
#13 = Utf8 SourceFile
#14 = Utf8 Hello.java
#15 = NameAndType #7:#8 // &amp;quot;&amp;lt;init&amp;gt;&amp;quot;:()V
#16 = NameAndType #5:#6 // num:I
#17 = Utf8 Hello
#18 = Utf8 java/lang/Object
{
public Hello();
 descriptor: ()V
 flags: ACC_PUBLIC
 Code:
 stack=1, locals=1, args_size=1
 0: aload_0
 1: invokespecial #1 // Method java/lang/Object.&amp;quot;&amp;lt;init&amp;gt;&amp;quot;:()V
 4: return
 LineNumberTable:
 line 1: 0

public int foo();
 descriptor: ()I
 flags: ACC_PUBLIC
 Code:
 stack=1, locals=1, args_size=1
 0: aload_0
 1: getfield #2 // Field num:I
 4: ireturn
 LineNumberTable:
 line 4: 0
}
SourceFile: &amp;quot;Hello.java&amp;quot;
&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;/div>

&lt;ul>
&lt;li>
&lt;h3 id="文件定义">
 文件定义
 &lt;a class="anchor" href="#%e6%96%87%e4%bb%b6%e5%ae%9a%e4%b9%89">#&lt;/a>
&lt;/h3>
&lt;p class="warn">Java字节码类文件（.class）是Java编译器编译Java源文件（.java）产生的“目标文件”。它是一种8位字节的二进制流文件， 各个数据项按顺序紧密的从前向后排列， 相邻的项之间没有间隙， 这样可以使得class文件非常紧凑， 体积轻巧， 可以被JVM快速的加载至内存， 并且占据较少的内存空间（方便于网络的传输）。
&lt;br>&lt;br>Java源文件在被Java编译器编译之后， 每个类（或者接口）都单独占据一个class文件， 并且类中的所有信息都会在class文件中有相应的描述， 由于class文件很灵活， 它甚至比Java源文件有着更强的描述能力。
&lt;br>&lt;br>class文件中的信息是一项一项排列的， 每项数据都有它的固定长度， 有的占一个字节， 有的占两个字节， 还有的占四个字节或8个字节。数据项的不同长度分别用
&lt;br>&lt;code>u1, u2, u4, u8&lt;/code>表示，分别表示一种数据项在class文件中占据&lt;code>1个字节， 2个字节， 4个字节，8个字节&lt;/code>。 可以把u1, u2, u3, u4看做class文件数据项的“类型” 。&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/debug/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/debug/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="debugger">
 debugger
 &lt;a class="anchor" href="#debugger">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="参数解释">
 参数解释
 &lt;a class="anchor" href="#%e5%8f%82%e6%95%b0%e8%a7%a3%e9%87%8a">#&lt;/a>
&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th align="left">index&lt;/th>
&lt;th>explain&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td align="left">-Xdebug&lt;/td>
&lt;td>启用调试特性&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">-Xrunjdwp&lt;/td>
&lt;td>&lt;sub-options> 在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。从 Java V5 开始，您可以使用 -agentlib:jdwp 选项，而不是 -Xdebug 和 -Xrunjdwp。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">-Djava.compiler=NONE&lt;/td>
&lt;td>禁止 JIT 编译器的加载&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">transport&lt;/td>
&lt;td>传输方式，有 socket 和 shared memory 两种，我们通常使用 socket（套接字）传输，但是在 Windows 平台上也可以使用shared memory（共享内存）传输。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">server（y/n）&lt;/td>
&lt;td>VM 是否需要作为调试服务器执行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">address&lt;/td>
&lt;td>调试服务器的端口号，客户端用来连接服务器的端口号&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">suspend（y/n）&lt;/td>
&lt;td>值是 y 或者 n，若为 y，启动时候自己程序的 VM 将会暂停（挂起），直到客户端进行连接，若为 n，自己程序的 VM 不会挂起&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;h3 id="参数样例">
 参数样例
 &lt;a class="anchor" href="#%e5%8f%82%e6%95%b0%e6%a0%b7%e4%be%8b">#&lt;/a>
&lt;/h3>
&lt;p class="warn">Command line arguments for remote JVM.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>JDK版本&lt;/th>
&lt;th>(attach mode)启动追加命令[参考下图]&lt;/th>
&lt;th>(listen mode)启动追加命令&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>JDK9 or later&lt;/td>
&lt;td>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8800&lt;/td>
&lt;td>-agentlib:jdwp=transport=dt_socket,server=n,address=localhost:8800,suspend=y&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JDK 5-8&lt;/td>
&lt;td>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8800&lt;/td>
&lt;td>-agentlib:jdwp=transport=dt_socket,server=n,address=localhost:8800,suspend=y&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JDK 1.4.x&lt;/td>
&lt;td>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8800&lt;/td>
&lt;td>-Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=localhost:8800,suspend=y&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JDK 1.3.x or earliar&lt;/td>
&lt;td>-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8800&lt;/td>
&lt;td>-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=localhost:8800,suspend=y&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/doc/advance/debug/debug-01.png" alt="" width="60%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/javaagent/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/javaagent/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introjavaagent">
 Intro(JavaAgent)
 &lt;a class="anchor" href="#introjavaagent">#&lt;/a>
&lt;/h2>
&lt;p class="warn">通过实现agent类中的premain方法将自定义的类转换器注册到JVM中，从而实现类加载之前&lt;strong>对字节码进行处理&lt;/strong>。本次实验中对类未进行处理，而是在加载类之前打印输出。
&lt;br>完整代码可


 &lt;a href="https://github.com/12302-bak/idea-test-project/tree/v2.0.0-BAK/_6_un_JTW" rel="noopener" target="_blank">参考&lt;/a>&lt;/p>
&lt;ul>
&lt;li>
&lt;h3 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h3>
&lt;h6 id="myagent" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="mytransfor" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="testmain" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="myagent" class="docsify-tabs__tab" data-tab="MyAgent">MyAgent&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="myagent">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">package agent;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;

public class MyAgent {
 public static void premain(String args, Instrumentation instrumentation){
 ClassFileTransformer classFileTransformer = new MyTransfor();
 instrumentation.addTransformer(classFileTransformer);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="mytransfor" class="docsify-tabs__tab" data-tab="MyTransfor">MyTransfor&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="mytransfor">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">package agent;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

public class MyTransfor implements ClassFileTransformer {
 @Override
 public byte[] transform(ClassLoader loader, String className, Class&amp;lt;?&amp;gt; classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

 /*_12302_2019-07-26_&amp;lt;此处可以静态代理&amp;gt;*/
 System.out.println(&amp;quot;from: &amp;quot; + className + &amp;quot;--&amp;gt; hello agent!&amp;quot;);

 /*_12302_2019-07-26_&amp;lt;return null 并不表示将要加载的类清空,而是不往其中添加任何东西&amp;gt;*/
 return null;
 }
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="testmain" class="docsify-tabs__tab" data-tab="TestMain">TestMain&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="testmain">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">package demo;

public class TestMain {
 public static void main(String[] args) {
 System.out.println(&amp;quot;this is _base.base.demo.TestMain.main(),and nothing else&amp;quot;);
 }
}
&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>&lt;/div>
&lt;/li>
&lt;li>
&lt;h3 id="构建及运行">
 构建及运行
 &lt;a class="anchor" href="#%e6%9e%84%e5%bb%ba%e5%8f%8a%e8%bf%90%e8%a1%8c">#&lt;/a>
&lt;/h3>
&lt;p class="tip">使用maven-assembly-plugin插件进行构建的。在&lt;code>assembly.xml&lt;/code>配置中排除主类包，并在pom.xml&lt;code>assembly&lt;/code>插件配置中定义了生成&lt;code>META-INF/MANIFEST.MF&lt;/code>文件且包含&lt;code>Premain-Class: agent.MyAgent&lt;/code> 属性。&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/doc/advance/javastrace/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/doc/advance/javastrace/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introjavastrace">
 Intro(JavaStrace)
 &lt;a class="anchor" href="#introjavastrace">#&lt;/a>
&lt;/h2>
&lt;p class="warn"> 一个java程序的运行全过程解析。&lt;/p> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel left-panel"style="max-width: 50%; width: 50%;">
&lt;p class="tip"> 右上java源代码，右下常量池，左下为Code方法块。&lt;/p>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">{
 public _jvm.classPrase.Student(int, java.lang.String, java.lang.String);
 descriptor: (ILjava/lang/String;Ljava/lang/String;)V
 flags: ACC_PUBLIC
 Code:
 stack=3, locals=4, args_size=4
 0: aload_0
 1: iload_1
 2: aload_2
 3: invokespecial #1 // Method _jvm/classPrase/Person.&amp;quot;&amp;lt;init&amp;gt;&amp;quot;:(ILjava/lang/String;)V
 6: aload_0
 7: aload_3
 8: putfield #2 // Field sid:Ljava/lang/String;
 11: return
 LineNumberTable:
 line 19: 0
 line 20: 6
 line 21: 11

 public void run();
 descriptor: ()V
 flags: ACC_PUBLIC
 Code:
 stack=2, locals=1, args_size=1
 0: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
 3: ldc #4 // String run()...
 5: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
 8: return
 LineNumberTable:
 line 23: 0
 line 24: 8

 public int study(int, int);
 descriptor: (II)I
 flags: ACC_PUBLIC
 Code:
 stack=3, locals=5, args_size=3
 0: bipush 10
 2: istore_3
 3: bipush 20
 5: istore 4
 7: iload_1
 8: iload_2
 9: iload_3
 10: imul
 11: iadd
 12: iload 4
 14: isub
 15: ireturn
 LineNumberTable:
 line 26: 0
 line 27: 3
 line 28: 7

 public static int getCnt();
 descriptor: ()I
 flags: ACC_PUBLIC, ACC_STATIC
 Code:
 stack=1, locals=0, args_size=0
 0: getstatic #6 // Field cnt:I
 3: ireturn
 LineNumberTable:
 line 31: 0

 public static void main(java.lang.String[]);
 descriptor: ([Ljava/lang/String;)V
 flags: ACC_PUBLIC, ACC_STATIC
 Code:
 stack=5, locals=2, args_size=1
 0: new #7 // class _jvm/classPrase/Student
 3: dup
 4: bipush 23
 6: ldc #8 // String dqrcsc
 8: ldc #9 // String 20150723
 10: invokespecial #10 // Method &amp;quot;&amp;lt;init&amp;gt;&amp;quot;:(ILjava/lang/String;Ljava/lang/String;)V
 13: astore_1
 14: aload_1
 15: iconst_5
 16: bipush 6
 18: invokevirtual #11 // Method study:(II)I
 21: pop
 22: invokestatic #12 // Method getCnt:()I
 25: pop
 26: aload_1
 27: invokevirtual #13 // Method run:()V
 30: return
 LineNumberTable:
 line 34: 0
 line 35: 14
 line 36: 22
 line 37: 26
 line 38: 30

 static {};
 descriptor: ()V
 flags: ACC_STATIC
 Code:
 stack=2, locals=0, args_size=0
 0: iconst_5
 1: putstatic #6 // Field cnt:I
 4: getstatic #6 // Field cnt:I
 7: iconst_1
 8: iadd
 9: putstatic #6 // Field cnt:I
 12: return
 LineNumberTable:
 line 13: 0
 line 15: 4
 line 16: 12
}
&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
 &lt;div class="docsify-example-panel right-panel"style="max-width: 50%; width: 50%;">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="java" data-line="" class="language-java line-numbers" style="max-height: none">&lt;code class="language-java">package _jvm.classPrase;

/**
 *
 * Copyright https://wtfu.site Inc. All Rights Reserved.
 *
 * @date 2024/3/8
 * @since 1.0
 * @author 12302
 *
 */
public class Student extends Person implements IStudyable {
 private static int cnt=5;
 static{
 cnt++;
 }
 private String sid;
 public Student(int age, String name, String sid){
 super(age,name);
 this.sid = sid;
 }
 public void run(){
 System.out.println(&amp;quot;run()...&amp;quot;);
 }
 public int study(int a, int b){
 int c = 10;
 int d = 20;
 return a+b*c-d;
 }
 public static int getCnt(){
 return cnt;
 }
 public static void main(String[] args){
 Student s = new Student(23,&amp;quot;dqrcsc&amp;quot;,&amp;quot;20150723&amp;quot;);
 s.study(5,6);
 Student.getCnt();
 s.run();
 }
}
class Person {
 private String name;
 private int age;
 public Person(int age, String name){
 this.age = age;
 this.name = name;
 }
 public void run(){}
}
interface IStudyable {
 public int study(int a, int b);
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">Constant pool:
 #1 = Methodref #14.#35 // _jvm/classPrase/Person.&amp;quot;&amp;lt;init&amp;gt;&amp;quot;:(ILjava/lang/String;)V
 #2 = Fieldref #7.#36 // _jvm/classPrase/Student.sid:Ljava/lang/String;
 #3 = Fieldref #37.#38 // java/lang/System.out:Ljava/io/PrintStream;
 #4 = String #39 // run()...
 #5 = Methodref #40.#41 // java/io/PrintStream.println:(Ljava/lang/String;)V
 #6 = Fieldref #7.#42 // _jvm/classPrase/Student.cnt:I
 #7 = Class #43 // _jvm/classPrase/Student
 #8 = String #44 // dqrcsc
 #9 = String #45 // 20150723
 #10 = Methodref #7.#46 // _jvm/classPrase/Student.&amp;quot;&amp;lt;init&amp;gt;&amp;quot;:(ILjava/lang/String;Ljava/lang/String;)V
 #11 = Methodref #7.#47 // _jvm/classPrase/Student.study:(II)I
 #12 = Methodref #7.#48 // _jvm/classPrase/Student.getCnt:()I
 #13 = Methodref #7.#49 // _jvm/classPrase/Student.run:()V
 #14 = Class #50 // _jvm/classPrase/Person
 #15 = Class #51 // _jvm/classPrase/IStudyable
 #16 = Utf8 cnt
 #17 = Utf8 I
 #18 = Utf8 sid
 #19 = Utf8 Ljava/lang/String;
 #20 = Utf8 &amp;lt;init&amp;gt;
 #21 = Utf8 (ILjava/lang/String;Ljava/lang/String;)V
 #22 = Utf8 Code
 #23 = Utf8 LineNumberTable
 #24 = Utf8 run
 #25 = Utf8 ()V
 #26 = Utf8 study
 #27 = Utf8 (II)I
 #28 = Utf8 getCnt
 #29 = Utf8 ()I
 #30 = Utf8 main
 #31 = Utf8 ([Ljava/lang/String;)V
 #32 = Utf8 &amp;lt;clinit&amp;gt;
 #33 = Utf8 SourceFile
 #34 = Utf8 Student.java
 #35 = NameAndType #20:#52 // &amp;quot;&amp;lt;init&amp;gt;&amp;quot;:(ILjava/lang/String;)V
 #36 = NameAndType #18:#19 // sid:Ljava/lang/String;
 #37 = Class #53 // java/lang/System
 #38 = NameAndType #54:#55 // out:Ljava/io/PrintStream;
 #39 = Utf8 run()...
 #40 = Class #56 // java/io/PrintStream
 #41 = NameAndType #57:#58 // println:(Ljava/lang/String;)V
 #42 = NameAndType #16:#17 // cnt:I
 #43 = Utf8 _jvm/classPrase/Student
 #44 = Utf8 dqrcsc
 #45 = Utf8 20150723
 #46 = NameAndType #20:#21 // &amp;quot;&amp;lt;init&amp;gt;&amp;quot;:(ILjava/lang/String;Ljava/lang/String;)V
 #47 = NameAndType #26:#27 // study:(II)I
 #48 = NameAndType #28:#29 // getCnt:()I
 #49 = NameAndType #24:#25 // run:()V
 #50 = Utf8 _jvm/classPrase/Person
 #51 = Utf8 _jvm/classPrase/IStudyable
 #52 = Utf8 (ILjava/lang/String;)V
 #53 = Utf8 java/lang/System
 #54 = Utf8 out
 #55 = Utf8 Ljava/io/PrintStream;
 #56 = Utf8 java/io/PrintStream
 #57 = Utf8 println
 #58 = Utf8 (Ljava/lang/String;)V
&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;/div>

&lt;ul>
&lt;li>
&lt;h3 id="虚拟机栈">
 虚拟机栈
 &lt;a class="anchor" href="#%e8%99%9a%e6%8b%9f%e6%9c%ba%e6%a0%88">#&lt;/a>
&lt;/h3> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel left-panel">
&lt;p class="warn"> JVM中通过java栈，保存方法调用运行的相关信息，每当调用一个方法，会根据该方法的在字节码中的信息为该方法创建栈帧，不同的方法，其栈帧的大小有所不同。栈帧中的内存空间还可以分为3块，分别存放不同的数据：
&lt;br>&lt;br>1). &lt;code>局部变量表&lt;/code>：存放该方法调用者所传入的参数，及在该方法的方法体中创建的局部变量。
&lt;br>2). &lt;code>操作数栈&lt;/code>：用于存放操作数及计算的中间结果等。
&lt;br>3). &lt;code>其他栈帧信息&lt;/code>：如返回地址、当前方法的引用等。
&lt;br>&lt;br>只有当前正在运行的方法的栈帧位于栈顶，当前方法返回，则当前方法对应的栈帧出栈，当前方法的调用者的栈帧变为栈顶；当前方法的方法体中若是调用了其他方法，则为被调用的方法创建栈帧，并将其压入栈顶。
&lt;br>&lt;em>&lt;strong>注意：局部变量表及操作数栈的最大深度在编译期间就已经确定了，存储在该方法字节码的Code属性中。&lt;/strong>&lt;/em>&lt;/p></description></item></channel></rss>