----------------------------------------------------
java是基于栈来执行的。
栈是解决程序如何运行的问题。而堆是解决程序数据如何存储的问题。
java中每个线程都有一个线程栈与之对应。这点很容易理解。因为不同的线程有不同的业务逻辑,因此需要一个独立的线程栈。
而堆则是所有线程所共享的。
栈的大小是在程序编译的时候就确定好了的【可以在class文件中看到栈大小】。而堆的大小却是可以在运行的时候动态扩展的。
----------------------------------------------------
java程序永远都是运行在栈上,所以在java中传递参数的时候,传递的也永远是基本类型和引用类型。不会直接传递对象本身。
在java这个编程语言里面,栈有几个意思。
1、数据结构上的栈,先入先出。
2、线程栈。每个线程都有一个栈空间。
3、操作数栈。每个函数都有一个操作数栈。在程序编译的时候,每个操作数栈的大小就已经确定好了。可以在class文件中看到这个操作数栈的大小。
先看这个例子。由于不同的函数有不同的操作数栈,那么在传递参数的时候,
----------------------------------------------------
java从哪里开始回收对象呢?
所有的java对象基本上都是采用了标记的方法来区分哪些对象是不能回收的对象,哪些是需要回收的。
在标记的过程中,起点可以是:静态变量、寄存器、java栈中的引用。
--------------------------------------------
java中是怎么解决内存碎片的呢?
标记-整理算法和基于两个相同大小内存区域的复制算法都可以解决碎片问题。
---------------------------------------------------
GC收集器算法
1、串行:单线程
2、并行:多个线程同时进行
3、并发:程序无需停止,能与GC同时执行
并发收集器主要是减少老年代的收集时间。在年轻代收集的时候,是并发的。应用程序无需停止。在老年代的时候,收集初期会对整个应用进行暂停,在收集中还会再暂停一次。
第二次暂停会比第一次稍长。在此过程中,多个线程同时进行垃圾回收工作。
Concurrent Mode Failure:由于并发收集器是在应用程序运行的同时进行垃圾回收,所以在回收的时候,要保证程序还有足够的内存用于运行。
如果此时内存不足,则会导致并发模式失败。此时,整个应用汇暂停下来进行垃圾回收。
-----------------------------------------------------------