JVM内存划分

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

内存区域

方法区(Method Area):类信息、方法(应该算作类的一部分)、常量、静态变量、JIT编译器编译后的代码都存储在这一区域;

堆(Heap):VM启动时创建,运行时创建的对象在这里,线程共享;

虚拟机栈(VM Stack)、本地方法栈(Native Method Stack):程序在运行过程中,一个线程执行,需要调用一连串的类、方法,方法执行过程中,还要创建局部变量,这些信息都在栈中存储;

程序计数器:当前线程所执行的字节码行数指示器,每个线程都有一个计数器,用于在处理器线程切换时,可以恢复到之前执行的进度;

 

对象访问

  1. 通过句柄访问,引用先指向堆中的句柄池,句柄池再指向方法区中的对象类型数据和实例数据;
  2. 直接指针访问:引用直接指向对中的实例数据,实例数据中有一个指向对象类型数据的指针;hotspot使用的这种方式;

比较:对于句柄的方式,对象移动时,只需要修改实例数据的指针,直接指针的方式的好处是:不需要二次查找对象实例数据;

 

 

 

new Object()步骤:

  1. 找该对象所需要的类信息,如果没加载则先加载类;
  2.  vm为对象分配内存,内存的大小在类加载的时候已经确定,所以是固定的;
  3. 将分配到的内存空间初始化为零值,保证了对象在未初始化之前就可以直接使用;
  4. 给该对象进行必要的设置,比如类的元数据信息,gc age,对象哈希码等,这些都放在对象头中;
  5. 这时候从vm角度讲,一个类已经初始化完成,从使用者的角度讲才刚开始,这里需要执行重要的一步,初始化<init>,在此之前,所有字段都为零,init之后才算是真正的创建了一个对象;

 

对象在内存中的存储布局(HotSpot):

· 对象头:包含两部分,类型指针、对象自身的运行时数据(HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等);

· 实例数据:真正存储的有效信息,用户定义的各字段信息,包括父类,注意,new 子类时,肯定是先new 父类;

· 对齐填充:不是必定存在,只有hotspot规定,起对象的内存大小必须是8字节的整数倍;

 

oopMap:

在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了,在GC找可以回收的对象时,先扫描栈,但是栈上记录对象引用位置的地方,只有一个“位置”信息,不知道这个位置指向的内存上存储的是否是一个对象,所以,JVM也不敢回收。

JVM用oopMap来记录哪些位置是对象的引用。oopMap在JIT编译的时候,会在一些方法的特定的点存储一份oopMap,在回收内存时,从指令执行到存储了oopMap的位置(安全点)开始切入,查找被引用的对象。

使用了oopMap的这种方式,叫“准确式GC”,对于JNI方法,JVM要求,必须采用句柄访问对象的方式;

还有两种方式,保守式、半保守式,半保守式是通过句柄访问对象的方式处理对象的回收,句柄不移动,句柄指向的对象移动;保守式时,进行GC时,JVM开始从一些已知位置(例如说JVM栈)开始扫描内存,扫描的时候每看到一个数字就看看它“像不像是一个指向GC堆中的指针”。

 

rememberedSet:

在G1回收器中,将堆空间分为N多个大小相等Region,回收时,可以选择一部分Region区域回收,这时候会出现一个问题,如果要回收的Region中对对象被其他Region引用了怎么办(其他收集器中的新生代与老年代之间的对象引用)?G1在每个Region维护了一个rememberedSet,里面存储了和他其他区域的引用关系表,这样在扫描时,不需要扫描所有的Region。这个引用关系信息,在对栈中对Reference的写操作时,先检查有没有跨Region的引用,有就记录到这个列表中;

 

JVM常用参数:

-Xms设置堆的最小空间大小;

-Xmx设置堆的最大空间大小;

-Xmn:设置年轻代大小;

-XX:NewSize设置新生代最小空间大小;

-XX:MaxNewSize设置新生代最大空间大小;

-XX:PermSize设置永久代最小空间大小;

-XX:MaxPermSize设置永久代最大空间大小;

-Xss设置每个线程的堆栈大小;

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集;

-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等;

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看