Java程序如何不产生垃圾

Wesley13
• 阅读 479

应用程序如何可以不产生垃圾看上去很难想象,而且这个话题已经复杂到超出本文讨论的范畴,但是如果考虑以下几个方面可能会容易理解:

  • JVM将内存分成两个部分来管理:堆和栈。这就是为什么当缺少内存时会有两个不同的错误(OutOfMemoryError和StackOverflowError)。栈内存只能被当前线程和当前执行的方法访问,因此,当线程离开当前执行的方法,这块内存会被自动释放,而无需额外垃圾回收器。然而,堆内存可以被整个应用程序在任何时刻访问,这意味着独立的垃圾回收器需要区分内存块什么时候才不被使用,可以被回收。
  • 基本数据类型内存总是在栈上分配,因此这对垃圾回收器没有压力。如果代码中基本上都使用基本类型,那么垃圾回收器处理的对象就少了。
  • 不产生垃圾不等于不创建对象,如果对象创建满足以下几个条件,仍然可以在创建对象之后不需要垃圾回收器:
    • 应用程序或者库在初始化的时候生成有限个数的对象,然后不断复用这些对象。但是这需要依赖开发者非常熟悉应用程序的内存占用。
    • 有的时候编译器可以发现一些特定对象不会在方法外使用,这被称为逃逸分析。当确认对象生命周期不会超过方法,其内存可以分配到栈而非堆。因此,这些对象占用的内存会在当前方法结束的时候自动消除。

虽然去除垃圾回收可能实现,Kirk指出这样编写代码会非常不自然,并且会失去Java提供的很多特性。Martijn也同时指出,内存管理恰恰也是Java能够在业界成功的一个主要原因。

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
灯灯灯灯 灯灯灯灯
3年前
一次性带你了解清楚Java内存模型!
Java内存模型咳咳咳,能看完的都是人上人。。。。Java虚拟机内部使用JMM(Java内存模型)将内存划分为两个逻辑单元,线程栈(或者叫本地内存)和堆。每一个线程都有属于自己的线程栈,在线程栈中会保存局部变量(也叫做本地变量)、方法中定义的参数和异常处理器的参数(catch中的参数);这些参数和变量都属于线程局部操作,会被隔离,所以不受内存模
Wesley13 Wesley13
3年前
java运行时数据区
运行时数据区包括以下几个部分:程序计数器,堆,java栈,本地方法栈,方法区1.程序计数器:当CPU需要执行指令时,需要从程序计数器中获取当前需要执行的指令所在存储单元的地址。用来指示执行哪条指令。其大小不会随程序的执行而发生改变。2.Java栈:java方法执行的内存模型。存放的时一个个栈帧,每个栈帧对应一个被调用的方法。  栈帧中包括:局
Wesley13 Wesley13
3年前
java之jvm
1.JVM内存模型_线程独占:栈,本地方法栈,程序计数器线程共享:堆,方法区_回答以上问题是需回答两个要点:1\.各部分功能2\.是否是线程共享2.JMM与内存可见性JMM是定义程序中变量的访问规则,线程对于变量的操作只能在自己的工作内存中进行,而不能直接对主内存操作.由于指令重排序,读写的顺序会被打乱,因此JMM需要
Wesley13 Wesley13
3年前
JDK8中JVM堆内存划分
一:JVM中内存JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法存放本地暂时变量与线程中方法运行时候须要的引用对象地址。JVM全部的对象信息都存放在堆内存中。相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分不同的功能区块实现对堆内存中对象管理。堆内存不够最常见的错误就是OOM(OutOf
Wesley13 Wesley13
3年前
Java工程师成神之路
一、基础篇1.1JVM1.1.1.Java内存模型,Java内存管理,Java堆和栈,垃圾回收http://www.jcp.org/en/jsr/detail?id133http://ifeve.com/jmmfaq/1.1.2.了解JVM各种参数及调优
Stella981 Stella981
3年前
JVM总结3
    垃圾收集GarbageCollection通常被称为“GC”,它诞生于1960年MIT的Lisp语言,经过半个多世纪,目前已经十分成熟了。    jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于java堆和
Wesley13 Wesley13
3年前
Java面试笔记整理4
一.Java内存溢出的产生原因和解决办法?java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。导致OutOfMemoryError异常的常见原因有以下几种:1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;2.
Wesley13 Wesley13
3年前
Java 虚拟机垃圾收集机制详解
本文摘自深入理解Java虚拟机第三版垃圾收集发生的区域之前我们介绍过Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结
Stella981 Stella981
3年前
JVM学习第一天
程序计数器当前线程所执行的字节码的行号指示器每个线程都有自己私有的计数器native方法,计数器值为空该内存区域没有规定任何的OutOfMemoryError情况虚拟机栈Java方法执行的内存模型,用于存储局部变量标、操作数栈、动态链接、方法出口等信息虚拟机栈也是线程私有局部变量表所需的内存控件在