【Java 内存区域和GC机制】教程文章相关的互联网学习教程文章

如何设置Java虚拟机内存以适应大程序的装载【代码】【图】

Java虚拟机对于运行时的程序所占内存是有限制的,当我们的项目或者程序很大时,往往会照成内存溢出。举个例子:publicclass SmallTest1 {publicstaticvoid main(String[] args) {byte[] array = newbyte[1024*1024*500];}}当定义这样一个500MB的数组时,就会造成JVM内存溢出: 而Java虚拟机默认的程序运行能得到的内存大小是随系统的,由Java的api体系结构中,点击Java: 后找到 “-Xmxn”这一项:所以默认大小是根据系统设置的,那...

JavaScript垃圾回收(一)——内存分配【代码】

一、静态分配( Static Allocation )  从静态存储区域分配内存。程序编译的时候内存已经分配好了,并且在程序的整个运行期间都存在,如静态变量和全局变量。如下面这张网上找的图:把房间看做一个程序,我们可以把静态分配的内存当成是房间里的耐用家具。通常,它们无需释放和回收,因为没人会天天把大衣柜当作垃圾扔到窗外。 二、自动分配( Automatic Allocation )  在栈中为局部变量分配内存的方法,栈中的内存可以随着代...

Java内存区域【图】

Java虚拟机规范中,将内存划分为如下图所示的五大块:方法区、堆、虚拟机栈、本地方法栈以及程序计数器 程序计数器(又称PC寄存器),首先它是线程私有的,随着线程的创建而创建,消失而消失。它可以看做是当前线程所执行的字节码的行号指示器,记载着每一个线程当前运行的Java方法的内存地址,如果线程正在执行的是一个Java方法,这个计数器记录的就是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法这个计数器的值...

JAVA 垃圾收集器与内存分配策略【图】

引言 垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。垃圾收集技术需要考虑的三个问题是:哪些内存需要回收什么时候回收如何回收 http://my.oschina.net/jiangmitiao/blog/470426 中讲到java内存运行时区域的分布,其中程序计数器,虚拟机栈,本地方法区都是随着线程而生,随线程而灭,所以这几个区域就不需要过多考虑回收问题。但是堆和方法区就不一样了,只有...

Java内存模型(JMM)中的happens-before【代码】【图】

happens-before是JMM中最核心的概念,对于Java程序员来说,理解happens-before是理解JMM的关键 。1.JMM的设计  首先,来看看JMM的设计意图。从JMM的设计者的角度,在设计JMM时,需要考虑两个关键因素。  (1)程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程,程序员希望基于一个强内存模型来编写代码。  (2)编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可...

Java原理领悟-JMM(java内存模型认知)【代码】

总线锁、缓存锁、MESI缓存一致性协议、CPU 层面的内存屏障 1.JMM定义: Java Memory Model(java内存模型)是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、线程栈等内存区域)。1.1、多线程开发需要注意的问题:原子性 即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断...

Java数组在内存中是如何存放的【代码】【图】

阅读目录一维数组二维数组数组对象及其引用存放在内存中的哪里?Java中有两种类型的数组:基本数据类型数组;对象数组;当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对象的引用,这对数组来说也是一样的,因为数组也是一个对象;一维数组int[] arr = new int[3];在以上代码中,arr变量存放了数组对象的引用;如果你创建了空间大小为10的整形数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返...

【转】深入理解Java内存模型(六)——final【代码】

与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说明这两个规则:public class FinalExample {int i; ...

Java中内存泄露及垃圾回收机制

3 垃圾回收机制3.1 什么是垃圾 垃圾,内存中的垃圾,即内存中已无效但又无法自动释放的空间。在Java语言中,没有引用句柄指向的类对象最容易成为垃圾。,产生垃圾的情况有很多,主要有以下3种:(1) 超出对象的引用句柄的作用域时,这个引用句柄引用的对象就变成垃圾。例:{ Person p1 = new Person(); ……}引用句柄p1的作用域是从定义到“}”处,执行完这对大括号中的所有代码后,产生的Person对象就...

Java中会存在内存泄漏吗,请简单描述。

内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除。但是,即使这样,Java也还是存在着内存泄漏的情况,1、长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露。尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是Java中内存泄露的发生场景,通俗地说,就是...

java内存机制_堆和栈

java内存机制_堆和栈 问题的引入:问题一:String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); //true问题二:String str1 =new String ("abc"); String str2 =new String ("abc"); System.out.println(str1==str2); // false问题三:String s1 = "ja";String s2 = "va";String s3 = "java";String s4 = s1 + s2;System.out.println(s3 == s4);//falseSystem.out.println(s3.equals(s4));//true由于...

Java继承 子类的内存模型【代码】【图】

package subClass; class ParentClass {publicvoid fun(){System.out.println("ParentClass--->fun()");} }class SubClass extends ParentClass{int i=100;String name=new String("SubClass");publicvoid fun(){super.fun();System.out.println(name+"--->"+i);} }publicclass TestExtends {publicstaticvoid main(String args[]){SubClass sub=new SubClass();sub.fun();} } 1.super 是父类引用,当jvm加载subClass 时,将父...

JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)【图】

一、类和对象的相关概念1、面向对象和面向过程的理解面向对象和面向过程都属于解决问题的思考方式。面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问题,侧重于“谁来做”,比较适合解决中大型项目面向对象和面向过程不能分割开来,二者相辅相成,缺一不可!宏观上通过面向对象思考,微观上通过面向过程思考!2、类和对象的概念、关系、区别(1)概念对象:客观世界中所有...

充满BUG的世界观——再遇Java内存泄露【图】

发现内存泄露除了仔细看代码的确没有太好的方法。首先看gc log, 确定是内存泄露,而不是内存不够。内存泄露的特点就是以每次Full GC后使用的最低内存为起点,拟合一条线。如果这条线是随时间递增的一条曲线,那么很大程度上代表着内存泄露。然后使用 jmap -histo [pid] 来查看你的所有对象所占内存的比例。你可能很不幸的发现[B 这个byte数组对象占用了绝大多数。这的确没有更好的方法了。只能一点点的看代码。检查一下有没有写成循...

深入理解java虚拟机——读后笔记(一)(内存部分)

一、内存区域的划分(运行时数据区域)  ①程序计数器:程序计数器是一块较小的内存区域,字节码解释器通过改变此计数器的值来选取下一条要执行的字节码指令,可以看成是当前线程执行字节码的行号指示器。线程执行时的分支、循环、跳转、异常处理、线程恢复等功能都依赖它。每条线程拥有独立的程序计数器,互不影响,独立储存。此区域没有OutOfMemory。  ②Java虚拟机栈:虚拟机栈也是线程私有内存区域,生命周期和线程相同。每...