Android&java优化---(1)---jvm架构

原创 2015年11月21日 17:48:39

从2015年3月份跳槽到现在,已经1年多没有更新自己的博客了,也许是自己来新公司过于忙碌流程过多,也有可能是自己懈怠了,忘了程序员要不断的更新自己的知识结构,谨以此记与诸君共勉之!

题记:

程序员一直以来都被一些莫名奇妙的规范所限制,比如不能使用静态变量等等,这个问题我们不做讨论,但是作为一个优秀的程序员一定要有自己的知识架构,才能理解一些奇怪的编程规范,比如java可以不用初始化类变量,因为它(类本身)是在堆里面创建,所以初始化是多此一举,等等……

图片和部分观点来源于网络,经过自己思考形成的观点,由于作者水平有限(非科班),恳请各位斧正!

Jvm架构分析

(一)jvm架构参考http://blog.csdn.net/cutesource/article/details/5904501


(二)类执行机制参考:http://blog.csdn.net/cutesource/article/details/5904542

JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。

(三)内存管理和垃圾回收

参考:http://blog.csdn.net/cutesource/article/details/5906705

JVM内存组成结构:由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:

1)堆

所有通过new创建对象的内存都在堆中分配,其大小可以通过-Xmx-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为EdenSurvivor区,最后SurvivorFromSpaceToSpace组成,结构图如下所示:

新生代:新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制EdenSurvivor的比例

旧生代:用于存放新生代中经过多次垃圾回收仍然存活的对象

2)栈

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果-------两个信息:a)jvm是一个小的系统或则调度器,b)允许多个线程执行

3)本地方法栈

用于支持native方法的执行,存储了每个native方法调用的状态,--------主要是jvm实现的一些本地方法4)方法区

存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(PermanetGeneration)来存放方法区,可通过-XX:PermSize-XX:MaxPermSize来指定最小值和最大值

说明:1.JVM中堆内存是程序直接能使用的内存,而其他区域内存(方法区/栈区/程序计数器/本地方法栈)JVM自己使用的,所以也将JVM中内存划为堆区和非堆区(除堆之外的其他内存)
2.
非堆区内存由参数-XX:PermSize-XX:MaxPermSize指定。前者指定最小的内存大小,后者指定最大的内存大小。
3.
程序运行时,JVM会向操作系统申请一块内存,内存的一部分作为堆内存使用,一部分作为非堆内存使用

四)JVM分别对新生代和旧生代采用不同的垃圾回收机制

新生代的GC

新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在EdenFromSpaceToSpace之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从edensurvivor,最后到旧生代,用javavisualVM来查看,能明显观察到新生代满了后,会把对象转移到旧生代,然后清空继续装载,当旧生代也满了后,就会报outofmemory的异常,如下图所示

在执行机制上JVM提供了串行GCSerialGC)、并行回收GCParallelScavenge)和并行GCParNew

()java内存调优,JVM内存的系统级的调优主要的目的是减少GC的频率和FullGC的次数,过多的GCFullGC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。特别要关注FullGC,因为它会对整个堆进行整理,导致FullGC一般由于以下几种情况:

  • 旧生代空间不足
    调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象

  • PemanetGeneration空间不足
    增大PermGen空间,避免太多静态对象

  • 统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
    控制好新生代和旧生代的比例

  • System.gc()被显示调用
    垃圾回收不要手动触发,尽量依靠JVM自身的机制

调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果


总结:根据以上分析,我们的出以下结论:

一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配;

new创建的对象在堆内存中分配,出现栈的应用指向堆的内存现象


JVM解读(一):JVM体系结构

JVM全称是java Virtual Machine(java虚拟机),通过模拟一个计算机来完成一个计算机具有的功能 JVM屏蔽了与各个计算机平台相关的软件和硬件差异,所以JVM能够跨计算机体系结构来...
  • uxiaolang
  • uxiaolang
  • 2015年06月26日 16:06
  • 2832

JVM详解及优化

1. JVM堆内存划分 这两天看到下面这篇文章的图不错。 一图读懂JVM架构解析 1.1 JDK7及以前的版本 其中最上一层是Nursery内存,一个对象被创建...
  • liguo_lg
  • liguo_lg
  • 2017年02月17日 17:56
  • 1142

JVM 优化实战

本文讲解了 JVM 的内存划分和分配策略,并以截图和脚本展示常用可视化和命令行工具的使用方法,完整演示了 JVM 优化、内存泄露排查、gc.log 分析方法等。...
  • kefengwang
  • kefengwang
  • 2017年01月12日 15:13
  • 1485

一步步优化JVM一:概述、方法及需求

引用 :http://blog.csdn.net/zhoutao198712/article/details/7783038 现代JVM是一个具有灵活适应各种应用能力的软件,尽管很多...
  • lmy4710
  • lmy4710
  • 2015年01月03日 17:11
  • 718

JVM类加载与运行时优化

1. 类加载生命周期 a. 装载(load) i. 开始时机: 1) new实例化对象时,若类没有加载 2) 读取或设置一个类st...
  • u013510838
  • u013510838
  • 2016年07月13日 15:32
  • 1051

JVM参数优化(基础篇)

文中内容主要是自己关于JVM参数优化的一些总结,参考了网上很多大神的文章,有参数有说明,这里是为了记录下,也是为了可以给别人做个垫脚石。刚入坑不久,很多地方还不是很透彻,之后会继续研究。...
  • conansix
  • conansix
  • 2017年06月30日 11:27
  • 1265

从jvm编译优化角度解读String的赋值比较

下面是String对象赋值比较的例子:public class StringTest { static String a = "a"; static String b = "b"; ...
  • wanglei0622
  • wanglei0622
  • 2016年03月28日 16:27
  • 570

JVM垃圾回收与性能调优总结

JVM垃圾回收与性能调优总结 JVM调优的几种策略     一、JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代)T...
  • u013851082
  • u013851082
  • 2016年12月08日 12:59
  • 2163

深入JVM内核——原理、诊断与优化

偏向锁1、大部分是没有竞争的情况,所以通过偏向锁来提高性能 2、即锁会偏向与当前占有锁的线程 3、将对象头Mark的标记设置为偏向,并将占有锁线程ID写入对象头Mark 4、当其他线程请求相同的...
  • jyxmust
  • jyxmust
  • 2017年08月26日 00:20
  • 411

深入理解JVM读书笔记四: (早期)编译器优化

10.1概述Java 语言的 “编译期” 其实是一段 “不确定” 的操作过程,因为它可能是指一个前端编译器(其实叫 “编译器的前端” 更准确一些)把 .java 文件转变成 .class 文件的过程;...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2016年10月19日 21:28
  • 1448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android&java优化---(1)---jvm架构
举报原因:
原因补充:

(最多只允许输入30个字)