在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。 初步 ...
分类:
其他好文 时间:
2020-03-23 11:20:01
阅读次数:
67
常见的JAVA虚拟机HotSpot虚拟机运行时数据库由5部分构成:方法区,堆,虚拟机栈,本地方法栈,程序计数器。下面列举各个部分可能出现的异常及其出现原因。 1.方法区存放的已被虚拟机加载的类型信息,常量、静态变量、即时编译器编译后的代码缓存等数据。可能出现的异常有OutOfMemoryError, ...
分类:
编程语言 时间:
2020-03-23 00:16:03
阅读次数:
91
Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 Step2:分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。 ...
分类:
编程语言 时间:
2020-03-23 00:15:41
阅读次数:
78
jdk7之后 String s = new String("a") 如果执行intern方法时 字符串常量池中已有字符串"a"的引用 那么intern不执行任何操作 s的指向不变 intern方法返回"a"的引用 String s2 = new String("a") + new String("a ...
分类:
其他好文 时间:
2020-03-18 09:40:36
阅读次数:
58
一、对象的创建: 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没 有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便 ...
分类:
编程语言 时间:
2020-03-14 14:47:07
阅读次数:
68
一、两种创建字符串类型的方法 String str1="Iloveyou";//str1变量值为地址值(这里存疑吧,目前水平还不够,貌似Java中是哈希码),字符串放入String常量池,不开辟新空间 String str2=new String("Iloveyou");//str2变量为地址值(同 ...
分类:
编程语言 时间:
2020-03-13 20:35:09
阅读次数:
66
1.内存模型以及分区。 内存模型主要由方法区、堆、栈、本地方法栈、程序计数器。 方法区:供各线程共享的运行时的内存区域。存储了类信息,运行时常量池等,还存放static变量。 堆:通过new关键字,创建对象都会使用到堆内存。存放所有new出来的对象,只保存对象本身,不保存对象的引用。 栈:程序运行时 ...
分类:
其他好文 时间:
2020-03-12 18:45:22
阅读次数:
71
首先要说一下JVM内存空间分为五部分,分别是:方法区、堆、Java虚拟机栈、本地方法栈、程序计数器 方法区主要用来存放类信息、类的静态变量、常量、运行时常量池等,方法区的大小是可以动态扩展的, 堆主要存放的是数组、类的实例对象、字符串常量池等。 Java虚拟机栈是描述JAVA方法运行过程的内存模型, ...
分类:
其他好文 时间:
2020-03-07 12:58:31
阅读次数:
60
对象的创建通常通过new关键字(例外:反序列化,复制),其过程如下: 当遇到new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载,解析和初始化过,如果没有,必须先执行相应的类加载过程。 在类加载过程检查通过后,需要为新生对象分配内存,对象所 ...
分类:
其他好文 时间:
2020-03-06 17:04:01
阅读次数:
65
概述:记得有一次被一个技术人员面试,问我String是什么类型,如何和其他基本数据类型之间进行转换,那么今天就深入学习一下String 1、首先了解下JVM的体系结构图: 注意: 栈: 每个Java虚拟机线程都有自己的Java虚拟机栈,Java虚拟机栈用来存放栈帧,每个方法被执行的时候都会同时创建一 ...
分类:
其他好文 时间:
2020-03-03 10:44:21
阅读次数:
88