您的位置:

java方法区,java方法区的用法

本文目录一览:

Java的方法区和本地方法区有何不同?什么是Native Method?

java的方法区在jdk7及以前是永久代,使用的是虚拟机的内存,而到了jdk8,元空间取代了永久代,使用的是本地的内存。

Native Method是本地方法的意思,非java编写,比如c/c++,一般用于操作底层的硬件。在java中通过本地方法接口也就是带native修饰符的方法来调用本地方法。

java方法区中包含哪些内容,常量池中包含哪些内容

方法区里存储着class文件的信息和动态常量池,class文件的信息包括类信息和静态常量池。可以将类的信息是对class文件内容的一个框架,里面具体的内容通过常量池来存储。

动态常量池里的内容除了是静态常量池里的内容外,还将静态常量池里的符号引用转变为直接引用,而且动态常量池里的内容是能动态添加的。例如调用String的intern方法就能将string的值添加到String常量池中,这里String常量池是包含在动态常量池里的,但在jdk1.8后,将String常量池放到了堆中。

Java内存中的栈,堆和方法区的用法有什么不同

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)也叫静态存储区。

堆区:

存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 

2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 

2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:

又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 

2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

jdk1.8关于方法区的变化

1、 java7之前,方法区位于永久代(PermGen),永久代和堆相互隔离,永久代的大小在启动JVM时可以设置一个固定值,不可变;

2、 java7中,static变量从永久代移到堆中;

3、 java8中,取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中 ,但是实际上我们说的堆指的是用于存放java对象的那些空间。元空间并不在虚拟机中,而是使用本地内存

另外:

详情请见---

JAVA中方法区是不是堆的一部分

方法区,又称永久代(Permanent Generation),常称为PermGen,位于非堆空间,又称非堆区(Non-Heap space)。

方法区是被所有线程共享。

所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。

简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。

静态变量 + 常量 + 类信息(构造方法/接口定义) + 运行时常量池存 在方法区中 。

但是, 实例变量 存在 堆内存 中,和方法区无关。

以上,只是逻辑上的定义。在HotSpot中,方法区仅仅只是逻辑上的独立,实际上还是包含在Java堆中,也是就说,方式区在物理上属于Java堆区中的一部分,而永久区(Permanent Generation)就是方法区的实现。

Java方法区和堆分别储存什么

静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区。堆储存对象、数组、非静态变量。