We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Java 代码时运行在 jvm 虚拟机上,而虚拟机在执行 java 程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途。其中有些区域随着虚拟机的启动而存在,而有些区域则是依赖用户线程启动和结束而建立和销毁。
上面就是 JVM 运行时内存区域的结构。
在前面的 JVM 内存结构中,Java 堆和方法区是多个线程共享的数据区域。也就意味着多个线程可能操作保存在方法区中的同一个数据。这也就是常说的 Java的线程间通过共享内存进行通信。
Java 的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM 定义了一些语法集,这些语法集映射到Java语言中就是 volatile、synchronized 等关键字。
关于主内存和工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存,如果从工作内存同步回主内存的实现细节,JMM 定义了 8 种操作来完成。虚拟机必须保证每一种操作都是原子的。
Java 是一种面向对象的语言,而 Java 对象在 JVM 中的存储也有一定的结构,称为 Java 对象模型。
每一个Java类,在被 JVM 加载的时候,JVM 会给这个类创建一个 instanceKlass,保存在方法区,用来在JVM层表示该 Java 类。当我们在 Java 代码中,使用 new 创建一个对象的时候,JVM 会创建一个 instanceOopDesc 对象,这个对象中包含了对象头以及实例数据。
instanceKlass
instanceOopDesc
在下述情况下类必须进行初始化:
从 java 虚拟机的角度来讲,只有两种不同的类加载器:启动类加载器(Bootstrap ClassLoader),使用 C++ 语言实现;所有其他的类加载器:java 语言实现,独立于虚拟机外部,继承 ClassLoader。
其工作过程是:如果一个类加载器收到类加载的需求,不会自己尝试加载这个类,而是把该请求委托给父类加载器去完成,每一个层次的类加载器都是如此。因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成加载时,子加载器才会尝试自己去加载。
好处在于:安全,防止出现自定义加载器出现多个相同的类,导致程序混乱。
JVM 内存结构,和 Java 虚拟机的运行时区域有关。
Java 内存模型,和 Java 的并发编程有关。
Java 对象模型,和 Java 对象在虚拟机中的表现形式有关。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
JMM, JVM, Java ClassLoader
JVM 内存结构
Java 代码时运行在 jvm 虚拟机上,而虚拟机在执行 java 程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途。其中有些区域随着虚拟机的启动而存在,而有些区域则是依赖用户线程启动和结束而建立和销毁。
上面就是 JVM 运行时内存区域的结构。
Java 内存模型
在前面的 JVM 内存结构中,Java 堆和方法区是多个线程共享的数据区域。也就意味着多个线程可能操作保存在方法区中的同一个数据。这也就是常说的 Java的线程间通过共享内存进行通信。
Java 的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM 定义了一些语法集,这些语法集映射到Java语言中就是 volatile、synchronized 等关键字。
内存间相互操作
关于主内存和工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存,如果从工作内存同步回主内存的实现细节,JMM 定义了 8 种操作来完成。虚拟机必须保证每一种操作都是原子的。
Java 对象模型
Java 是一种面向对象的语言,而 Java 对象在 JVM 中的存储也有一定的结构,称为 Java 对象模型。
每一个Java类,在被 JVM 加载的时候,JVM 会给这个类创建一个
instanceKlass
,保存在方法区,用来在JVM层表示该 Java 类。当我们在 Java 代码中,使用 new 创建一个对象的时候,JVM 会创建一个instanceOopDesc
对象,这个对象中包含了对象头以及实例数据。类加载的过程
在下述情况下类必须进行初始化:
具体过程
类加载器
双亲委派模型
从 java 虚拟机的角度来讲,只有两种不同的类加载器:启动类加载器(Bootstrap ClassLoader),使用 C++ 语言实现;所有其他的类加载器:java 语言实现,独立于虚拟机外部,继承 ClassLoader。
其工作过程是:如果一个类加载器收到类加载的需求,不会自己尝试加载这个类,而是把该请求委托给父类加载器去完成,每一个层次的类加载器都是如此。因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成加载时,子加载器才会尝试自己去加载。
好处在于:安全,防止出现自定义加载器出现多个相同的类,导致程序混乱。
总结
JVM 内存结构,和 Java 虚拟机的运行时区域有关。
Java 内存模型,和 Java 的并发编程有关。
Java 对象模型,和 Java 对象在虚拟机中的表现形式有关。
The text was updated successfully, but these errors were encountered: