Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈

内存简介

 

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第1张图片

 

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第2张图片

 

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第3张图片

 

JVM内存模型—JDK8

线程私有:程序计数器、虚拟机栈、本地方法栈

线程共享:MetaSpace、Java堆

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第4张图片

 

程序计数器

当前线程所执行的字节码行号指示器(逻辑)

改变计数器的值来选取下一条需要执行的字节码指令(if、for这些都需要程序计数器)

和线程是一对一的关系即 "线程私有"

堆方法计数,如果是Native方法则计数器值为Undefined

不会发生内存泄漏

 

Java虚拟机栈(Stack)

Java方法执行的内存模型

包括多个栈帧

 

局部变量表:包含方法执行过程中的所有变量(boolean、char这些变量类型)

操作数栈:入栈、出栈、复制、交换、产生消费变量

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第5张图片

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第6张图片

 

代码的演示查看字节码

package com.binglian.jvm.model;

import javax.management.relation.RoleUnresolved;

public class ByteCodeSample {

	public static int add(int a,int b){
		int c=0;
		c=a+b;
		return c;
	}
}

javac

 

javap -verbose ByteCodeSample.class

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第7张图片

 

字节码代码

>javap -verbose ByteCodeSample.class


Classfile /C:/binglian/work/Java EE/binglian-javabasic/src/main/java/com/binglia
n/jvm/model/ByteCodeSample.class
  Last modified 2019-4-15; size 293 bytes
  MD5 checksum 970f738721757e3908f5b2ff1bf3b248
  Compiled from "ByteCodeSample.java"
public class com.binglian.jvm.model.ByteCodeSample
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:	//线程池的东西
   #1 = Methodref          #3.#12         // java/lang/Object."":()V
   #2 = Class              #13            // com/binglian/jvm/model/ByteCodeSamp
le
   #3 = Class              #14            // java/lang/Object
   #4 = Utf8               
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               add
   #9 = Utf8               (II)I
  #10 = Utf8               SourceFile
  #11 = Utf8               ByteCodeSample.java
  #12 = NameAndType        #4:#5          // "":()V
  #13 = Utf8               com/binglian/jvm/model/ByteCodeSample
  #14 = Utf8               java/lang/Object
{
  public com.binglian.jvm.model.ByteCodeSample();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."
":()V
         4: return
      LineNumberTable:
        line 5: 0

  public static int add(int, int);
    descriptor: (II)I
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=2
         0: iconst_0
         1: istore_2
         2: iload_0
         3: iload_1
         4: iadd
         5: istore_2
         6: iload_2
         7: ireturn
      LineNumberTable:
        line 8: 0
        line 9: 2
        line 10: 6
}
SourceFile: "ByteCodeSample.java"

 

执行add(1,2)相加的详细细节

局部变量表和操作数栈的交换过程

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第8张图片

 

递归为什么会引发java.lang.StackOverflowError异常

解决方法:限制递归深度,使用for这些进行替换

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第9张图片

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第10张图片

Java—内存模型独占部分:程序计数器、虚拟机栈、本地方法栈_第11张图片

 

本地方法栈

 

与虚拟机张相似,主要作用于标注native的方法

你可能感兴趣的:(Java)