简述java内存分配与回收策率有什么用?

Python012

简述java内存分配与回收策率有什么用?,第1张

引言:大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴有至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。

一、内存分配

内存分配:1.栈区:栈可以分为Java虚拟机和本地方法栈。2.堆区域:堆由所有线程共享,并在虚拟机启动时创建。这是存储对象实例的唯一目的,也是gc的主要领域。一般可以分为年轻一代和老一代两大块。3.方法区:由所有线程共享,用于存储信息、常量、静态变量等。由虚拟机加载的。它是由Java虚拟机描述为堆的逻辑部分。习惯被称为永久一代。4.程序计数器:是当前线程执行的行号指示器,跳转指令等都依赖于这个完成,线程私有。

二、回收策略

回收策略和次要垃圾收集和主要垃圾收集(完整垃圾收集)1.对象优先分配在堆区的Eden区。2.大物件直接进入老年代。3.长期生存者直接进入老年代。回收:当Eden区域没有足够的空间分配时,虚拟机将执行Minor GC。未成年人GC一次,一般发生在Eden新生代,因为这个区域的物体寿命短,频率高,回收速度快。主要气相色谱发生在老年代。一般触发老年的GC不会触发Minor GC,但是通过配置,Minor GC之前可以执行一次,可以加快老年的恢复。

三、总结

可达性分析:以名为“GC根”的对象为起点,从这些节点向下搜索。当一个对象不能连接到“垃圾回收根”时,意味着它是可回收的。

一 java内存结构

Heap(堆) 实例分配的地方 通过 Xms与 Xmx来设置

MethodArea(方法区域) 类的信息及静态变量 对应是Permanet Generation 通过 XX PermSize来设置

JavaStack(java的栈) 虚拟机只会直接对Javastack执行两种操作 以帧为单位的压栈或出栈 通过 Xss来设置 若不够会抛出StackOverflowError

ProgramCounter(程序计数器) 每一个线程都有它自己的PC寄存器 也是该线程启动时创建的 PC寄存器的内容总是指向下一条将被执行指令的饿地址 这里的地址可以是一个本地指针 也可以是在方法区中相对应于该方法起始指令的偏移量

Nativemethodstack(本地方法栈) 保存native方法进入区域的地址

当中Heap和MethodArea是被所有线程的共享使用的

而Javastack Programcounter和Nativemethodstack是以线程为粒度的 每个线程独自拥有自己的部分

二 内存模型

由以上可以知道java内存分为main memory和线程的Working Memory 就会涉及到这两种内存数据同步以及多个线程操作时数据一致性和可见性的问题 这就不可避免要加锁了 在java中可采用如下的形式

  synchronized关键字或使用ncurrent locks中的锁

  volatile关键字 Volatile表示的是线程每次操作都是在主内存中进行 这只能保证其可见性 而不能保证其的原子性 要有原子性还得加锁

  final变量(基本类型 类类型还是可以改值的)

三 如何保证线程安全

每个线程只操作自有的数据 这个可能性要小

设计的类无数据成员 也就没有共享变量 要有可用是 final或volatile

lishixinzhi/Article/program/Java/hx/201311/26489