进程:jvm分配独立的运行空间,彼此不会相互影响。
线程:是在进程的内部,有独立的空间运行代码。
A process can be thought as an instance of a program in execution. A process is an independent entity to which system resources are allocated, Each process is executed in a separate address space, and one process cannot access the variables and data structures of another process. If a process wishes to access another process' resources, inter-process communications have to be used.
内存中分配独立的运行空间
A thread exists within a process and shares the process' resources (including its heap space). Multiple threads within the same process will share the same heap space. This is very different from processes, which cannot directly access the memory of another process. Each thread still has its own registers and its own stack, but other threads can read and write the heap memory.
A thread is a particular execution path of a process.
garbage collection:
mark:starts from root node of your application(main), walks the object graph, marks objects that are reachable as live.
sweep: delete unreachable objects
compacting:compact the memory by moving around the objects and making the allocation contiguous than fragmented.
1、强引用(StrongReference)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
2、软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。
3、弱引用(WeakReference)
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
4、虚引用(PhantomReference)
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。
A serial collector
Basic garbage collector that runs in single thread, can be used for basic applications.
A concurrent collector
A thread that performs GC along with application execution as the application runs, does not wait for the old generation to be full - Stop the world only during mark/re-mark.
A parallel collector
Used multiple CPUs to perform FC. Multiple threads doing mark/sweep etc. Does not kick until heap is full/near-full. "stops-the world" when it runs.
Use concurrent collecto(CMS) when
there is more memory
there is high number of CPUs
Application demands short pauses (标记-清理)
Use a parallel collector when
There is less memory
There is lesser number of CPUs
Application demands high throughput and can withstand pauses.
jvisualvm
young GC:当young gen中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。full GC:当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。
(https://www.zhihu.com/question/41922036/answer/93079526)
当Eden区没有足够的空间进行分配时,虚拟机发生一次minorGC。
Parallel Scavenge 收集器友谊个参数 -XX:+UseAdaptiveSizepPolicy 打开这个开关就不需要手动指定新生代大小、 Eden与Survivor比例等细节参数,虚拟机会自动调节 以提供最合适的pause和throughput,这种策略叫GC Ergononmics
real —— 程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待 I/O 完成)。
user —— 进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所使用的实际 CPU 时间,其他进程和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示 GC 线程执行所使用的 CPU 总时间。
sys —— 进程在内核态消耗的 CPU 时间,即在内核执行系统调用或等待系统事件所使用的 CPU 时间。
user + sys 时间告诉我们程序执行实际使用的 CPU 时间。注意这里指所有的 CPU,因此如果在进程里有多个线程的话,这个时间可能会超过 real 所表示的时钟时间。
Java GC 时间
上面我们解释了三个时间的概念,接下来我们用一些例子来更好地说明这些概念:
例1:
[Times: user=11.53 sys=1.38, real=1.03 secs]
在这个例子中,user + sys 时间的和比 real 时间要大,这主要是因为日志时间是从 JVM 中获得的,而这个 JVM 在多核的处理器上被配置了多个 GC 线程,由于多个线程并行地执行 GC,因此整个 GC 工作被这些线程共享,最终导致实际的时钟时间(real)小于总的 CPU 时间(user + sys)。
例2:
[Times: user=0.09 sys=0.00, real=0.09 secs]
上面的例子中的 GC 时间是从 Serial 垃圾收集器 (串行垃圾收集器)中获得的。由于 Serial 垃圾收集器是使用单线程进行垃圾收集的,因此 real 时间等于 user 和 sys 时间之和。