java的内存机制

问题描述

一个非常简单的问题,String a="1";String a=new String("1");问题如下:两个内存机制不一样是肯定的吧,String a=new String("1");里面a是引用,a装的是1在内存里面的地址,也就是占用了两块内存String a="1";里面a装的直接是值,只占用一块内存????

解决方案

String a="1"; a指向String的常量池中的“1”;String a=new String("1"); 在内存中生成一个String的对象,同时在内存中生成一个一个指向刚才创建的String对象的一个引用,也就是a
解决方案二:
在java 中 String类型是很特殊的,既可以是基本类型也可以是高级类型,String a = "1";此时String表示基本类型,a是在stack声明的变量,指向串池中的字符串"1";此处有一个变量一个对象(a是变量,"1"是串池中的字符串对象)String a = new String("1");表示高级类型,开辟一块内存,存放串池的地址,指向串池中的"1",a指向该内存。
解决方案三:
1、字符串常量在常量池 2、栈中通过ldc压入常量池引用可参考http://www.iteye.com/topic/1122533#2337877
解决方案四:
这两者的区别,不是在于a的区别,a都是一样的都是装了一个指向字符串对象的引用;而是在于生成这个字符串对象的过程的区别。看看它们的字节码的区别就知道了:String a="1"; ldc #2; //String 1astore_1String a=new String("1"); new #3; //class java/lang/Stringdupldc #2; //String 1invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)Vastore_1

时间: 2024-12-18 04:20:10

java的内存机制的相关文章

Java的内存回收机制

原文地址:http://www.cnblogs.com/xiaoxuetu/archive/2013/03/29/2987805.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存.因此就有了Java程序员到最后应该去了解JVM,才能写出更高

JAVA虚拟机内存分配与回收机制

Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现.Java虚拟机有自己想象中的硬件,如处理器.堆栈.寄存器等,还具有相应的指令系统. Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存

关于Java 数组内存分配一点认识

 可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题.         呵呵.突然就发现许多书上"基本数据类型存储在栈内存当中,对象则保存在堆内存"这句话完全是错误的.下面是个简单的例子代码: public class Test { public static void main(String[] argv) { // 静态初始化数组 String[] names = { "Michael", "Orson", &q

Java日志缓存机制的实现

概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打 印的日志级别,这样就会带来一些不便. 在 JDK 提供的日志功能中,日志级别被细化为 9 级,用以 区分不同日志的用途,用来记录一个错误,或者记录正常运行的信息,又或是记录详细的调试信息.由于日志 级别是静态的,如果日志级别设定过高,低级别的日志难以打印出来,从而导致在错误发生时候,难以去追踪 错误

找出Java程序内存溢出的元凶

我曾经在刚入行的时候做过一个小的swing程序,用到了java SE,swing,Thread等东东,当初经验少 也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛 java.lang.OutofMemoryError异常,就是java的内存溢出.当时也上网查了不少资料,试过一些办法,代 码也稍微做了些优化,但是有一个问题我始终是找不到解决的方案 - 不知为什么子窗体关闭后java的垃 圾回收机制无法回收其资源,因为这个Java程序可能要经常开关一些子窗体,那么这些子窗

Android开发:内存机制分析——堆和栈

  1.dalvik的Heap和Stack 这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native.这个以后再说. 开发:内存机制分析--堆和栈-"> 下面针对上面列出的数据类型进行说明,只有了解了我们申请的数据在哪里,才能更好掌控我们自己的程序. 2.对象实例数据 实际上是保存对象实例的属性,属性的类型和对象本身的类型标记等,但是不保存实例的方法.实例的方法是属于数据指令,是保存在Stack里面,也就是上面表格里面的类方法. 对象实例在Heap中分配好

收集器-java垃圾回收机制怎么回收变量

问题描述 java垃圾回收机制怎么回收变量 如下: 1.Object aobj=new Object() 2.Object bobj = new Object() 3. Object cobj = new Object() 4.aobj = bobj; 5.aobj = cobj; 6.cobj = null; 7.aobj = null; 那么第几行的obj符合垃圾收集器的收集标准. A:1 B:2 C:3 D:4 E:5 F:6 G:7 垃圾收集器的收集标准是什么? 是不是不引用了就可以收集

Java虚拟机类加载机制——案例分析

  在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬念.建议先看完<Java虚拟机类加载机制>这篇再来看这个,印象会比较深刻,如若不然,也没什么关系~~ 下面是程序代码: package jvm.classload; public class StaticTest { public static void main(String[] args) { staticFunction(); } st

Java数组内存分析

1. Java数组是静态的 Java是静态语言,所以Java的数组也是静态的,即:数组被初始化后,长度不可变 静态初始化:显式指定每个数组元素的初始值,系统决定数组长度 String[] books = new String[]{"疯狂Java讲义","Thinking in Java","Java核心技术卷"}; String[] names = new String[]{"张三","李四","