堆内存

【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-29 03:07:16
好文章来自: https://www.cnblogs.com/lixinjie/p/a-answer-about-thread-safety-in-a-interview.html#4279679 不是线程的安全 面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。 论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。切记望文生义。 同理,“线程安全”也不是指线程的安全,而是指内存的安全。为什么如此说呢?这和操作系统有关。 目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保障的。 在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。 假设某个线程把数据处理到一半,觉得很累,就去休息了一会,回来准备接着处理,却发现数据已经被修改了,不是自己离开时的样子了。可能被其它线程修改了。 比如把你住的小区看作一个进程,小区里的道路/绿化等就属于公共区域。你拿1万块钱往地上一扔,就回家睡觉去了。睡醒后你打算去把它捡回来,发现钱已经不见了。可能被别人拿走了。 因为公共区域人来人往,你放的东西在没有看管措施时,一定是不安全的。内存中的情况亦然如此。 所以线程安全指的是

栈内存和堆内存的区别

亡梦爱人 提交于 2019-12-28 21:03:59
  在Java中, 栈(stack) 是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本类型(如int、float等)的变量、指令代码、常量及对象句柄(也就是对象的引用地址)。   栈内存的操作方式类似于数据结构中的栈(仅在表尾进行插入或删除操作的线性表)。 栈的优势 在于,它的存取速度比较快,仅此于寄存器,栈中的数据还可以共享。其 缺点 表现在,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。    堆(heap) 是一个程序运行动态分配的内存区域,在Java中,构建对象时所需要的内存从堆中分配。这些对象通过new指令“显式”建立,这种分配方式类似于数据结构中的链表。堆内存在使用完毕后,是由垃圾回收(Garbage Collection,GC)器“隐式”回收的。    堆的优势 是在于动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。其 缺点 为,由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。 来源: https://www.cnblogs.com/Hellorxh/p/10832256.html

栈和堆的区别

不羁的心 提交于 2019-12-28 00:53:37
栈和堆的区别 概念: 栈(stack)是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本类型(如int、float等)的变量、指令代码、常量及对象句柄(也就是对象的引用地址)。   栈内存的操作方式类似于数据结构中的栈(仅在表尾进行插入或删除操作的线性表)。栈的优势在于,它的存取速度比较快,仅此于寄存器,栈中的数据还可以共享。其缺点表现在,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 堆(heap)是一个程序运行动态分配的内存区域,在Java中,构建对象时所需要的内存从堆中分配。这些对象通过new指令“显式”建立,这种分配方式类似于数据结构中的链表。堆内存在使用完毕后,是由垃圾回收(Garbage Collection,GC)器“隐式”回收的。 区别及特点: 1)各司其职 最主要的区别就是栈内存是用来存储局部变量和方法调用。而堆内存是用来存储Java中的对象。引用变量指向的对象都存储在堆内存中。 2)独有还是共享 栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。而堆内存中的对象对所有线程可见,堆内存中的对象可以被所有线程访问,是共享的。 3)异常错误 如果栈内存没有可用的空间用来存储方法调用和局部变量,那么JVM会抛出java.lang.StackOverFlowError

JVM内存初学 堆、栈、方法区

筅森魡賤 提交于 2019-12-27 21:53:09
转自: http://www.open-open.com/lib/view/open1432200119489.html 这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助。 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区: 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 为了更清楚地搞明白发生在运行时数据区里的黑幕,我们来准备2个小道具(2个非常简单的小程序)。 AppMain.java public class AppMain

tomcat优化

点点圈 提交于 2019-12-23 09:09:41
-server:启用jdk的server版本 -xms:虚拟机初始化时的最小堆内存 -xmx:虚拟机可使用的最大堆内存(尽量设置为xms一样的值,避免jvm因为频繁的gc导致性能大起大落) -xx:permsize设置非堆内存的初始值,默认为物理内存的1/64 -xx:maxnewsize:新生代占整个堆内存的最大值,也称内存最大永久保留区域 常见报错 outofmemoryerror 内存溢出,调整xms和xmx即可 来源: CSDN 作者: sclkw 链接: https://blog.csdn.net/qq_44805559/article/details/103644608

堆、栈和本地堆浅析

那年仲夏 提交于 2019-12-22 15:04:42
堆、栈和本地堆 堆和栈站在数据结构的方面来说与堆栈是一样的,在内存方面来说,它们为内存的不同的区域,它们都是连续的内存空间,在分配和销毁空间时都满足后进先出的特点。 拿一个应用程序来说,堆中保存全局变量,栈中保存局部变量,在一个应用程序开始执行时,堆的空间就定了,栈是在代码段中的,在这段空间中,除去代码占用的空间,其余的空间会分配给栈,说堆时要考虑操作系统,不同的操作系统堆的分配也不同。 访问栈中的数据速度较访问堆中的数据要快,原因是操作程序对栈的操作是段内寻址,而对堆的操作是段间寻址。 堆又名自由存储区,其上的对象生命周期一般比较长,不会随方法执行完毕而消亡。栈是依赖于方法而存在的,其上的对象生命周期一般比较短,方法执行结束后,栈会被清空,其上所有的对象都会随之而消亡。 本地堆是相对于 .NET 中的托管堆而言的。本地堆上的对象生命周期全部由程序员负责,在 C++ 中表现为 new 操作符和 delete 操作符。而托管堆上的对象生命周期部分地由垃圾收集器负责,在 VC++ 2005 中程序员可以用 gcnew 来在托管堆上为对象分配内存,但是对象内存的释放却要由垃圾收集器来负责。 来源: https://www.cnblogs.com/yhl1234/archive/2008/05/21/1201142.html

解释内存中的栈、堆和静态区的用法

。_饼干妹妹 提交于 2019-12-21 19:23:00
解释内存中的栈、堆和静态区的用法 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中 栈空间 ; 而通过new关键字和构造器创建的对象放在 堆 空间; 程序中的字面量(interal)如直接书写的100、"hello"和常量都是放在 静态区 中 栈空间 操作起来最快但是 栈 很小,通常大量的对象都是放在 堆空间 ,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成 堆空间 来使用; 例如: String str = new String ("hello"); 上面的语句中,str放在 栈 中,用new创建出来的字符串对象放在 堆 上,而"hello"这个字面量放在 静态区 。 来源: CSDN 作者: 美羊羊的贴身狂少 链接: https://blog.csdn.net/weixin_44971781/article/details/103645982

内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

谁说胖子不能爱 提交于 2019-12-19 10:01:11
区别: “==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。(引用类型) 如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。 注:如果有对 内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区) 感兴趣的可以去看看这篇博客,里面写的很详细。对我还在学基础的人来说帮助很大,理解了很多内容,还有待消化。 equals方法是由Object类提供的,可以由子类来进行重写 Object类默认的实现如下: 1 public boolean equals(Object obj) { 2 3 return (this == obj); 4 5 } 默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。 Java中很多类(String类 Date类 File类)等都对equals方法进行了重写,这里拿常见的String类举例。 1 public class Test { 2 public static void main(String[] args) { 3 String str1 = "abc"; 4 String str2 = "abc"; 5 System.out.println(str1==str2);//true 6 7 8 String str3

js函数的概念及作用 作用域

半腔热情 提交于 2019-12-19 04:46:37
函数的概念和作用 函数 函数对于任何语言来说都是一个核心概念,通过函数可以封装任意多条语句,而且可以在任何地方任何时候调用执行。函数使用 function 关键字声明后面跟一组参数以及函数体。语法如下: function functionName ( arg1 , arg2 ) { // 这里是要执行的代码 } 示例: <!DOCTYPE html> <html> <head> <script> function myFunction(){ alert("Hello World!"); } </script> </head> <body> <button οnclick="myFunction()">点击这里</button> </body> </html> 定义:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。当调用该函数时,会执行函数内的代码。可以在某事件发生时直接调用函数(比如当用户点击按钮时),并且可由 JavaScript 在任何位置进行调用。 函数参数 ECMAScript 中函数的参数与大多数其他语言中的函数的参数有所不同,ECMAScript 中的函数不介意你传递多少个参数,也不会在意传递进来的参数是什么数据类型。 在调用函数时,您可以向其传递值,这些值被称为参数。这些参数可以在函数中使用。可以发送任意多的参数,由逗号 (,) 分隔: function

BSS段 data段 text段 堆heap 和 栈stack

你。 提交于 2019-12-19 01:40:27
BSS段:BSS段(bss segment) 通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment) 通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text segment) 通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 堆(heap): 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈(stack) :栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存