JVM运行时内存组成分为一些线程私有的,其他的是线程共享的。
  
  线程私有
  
  程序计数器:当前线程所执行的字节码的行号指示器。
  
  Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧,存储局部变量表,操作栈,动态链接,方法出口等信息。每个线程都有自己独立的栈空间,线程栈只存储基本类型和对象地址,方法中局部变量存放在线程空间中。
  
  本地方法栈:Native方法服务,在hotspot虚拟机中和java虚拟机栈合二为一。
  
  线程共享
  
  java堆:存放对象实力,几乎所有的对象实例及其属性都在这里分配内存。此外,jvm在内存新生代eden space中开辟了一块线程私有的区域,称作TLAB(Thread Local Allocation Buffer),也是每个线程的缓冲区,默认设定为占用Eden space的1%。在编译器做逃逸分析的时候,根据分析结果,决定是在栈上还是在堆上分配内存,如果在堆上则再分析是否在TLAB上分配内存。在TLAB上分配由于是线程私有的,因此没有锁的开销,效率较高。
  
  方法区:存储已经被虚拟机加载的类信息,常量,静态变量,JIT编译后的代码等数据,也称作永久代。java7已经把字符串常量池移动到堆中,在调用String的intern方法时,如果堆中存在相同的字符串对象,会直接保存对象的引用,不会重新创建对象。
  
  直接内存:NIO,Native函数直接分配的堆外内存。DirectBuffer引用会使用此部分内存。
  
  内存分配过程
  
  编译器通过逃逸分析,确定对象是在栈上分配还是堆上分配。如果在堆上分配直接进入步骤4。
  
  如果是tlab_top + size <= tlab_end,则在TLAB上直接分配对象并增加tlab_top的值。如果现有TLAB不足存放当前对象则进入步骤3。
  
  重新申请一个TLAB,并再次尝试存放当前对象,如果放不下,则进入步骤4。
  
  在Eden区加锁(此区多线程共享),如果eden_top + size <= eden_end,则将对象存放在eden区,增加eden_top的值,如果eden区不足以存放,则进入步骤5。
  
  执行一次YGC。
  
  经过YGC后,如果eden还放不下对象,则直接分配到老年代。
  
  对象访问
  
  句柄访问:通过栈本地变量表,找到堆中对象实例指针,根据指针在堆中找到实例数据,在方法区中找到对象类型数据。
  
  直接指针:通过栈本地变量表,找到堆中对象实例指针,对象实例指针中保存对象实例数据,在方法区中找到对象类型数据。
  
  对象创建
  
  对象在eden完成内存分配。
  
  eden满了,在创建对象,会因为申请不到空间,触发minor gc,堆eden+s 区进行回收。
  
  进行minor gc时,eden区不能被回收的对象进入s区,另一个s区中不能被gc回收的对象也会进入这个s区,始终保证一个s区空置。
  
  如果s区满了,这些对象会被copy到old区,或者s区没有满,但是有些对象足够old了,会被放入old区。
  
  old区满了之后,进行full gc。
  
  内存溢出
  
  在JVM申请内存的过程中,会遇到无法申请到足够内存的情况,从而导致内存溢出。
  
  虚拟机栈和本地方法区栈溢出:statkoverflowerror:线程请求的栈深度大于虚拟机所允许的最大深度,循环递归会触发这种OOM。outfomemoryerror:虚拟机在扩展栈时无法申请到足够的内存空间,一般可以通过不停创建线程触发这种OOM。
  
  java堆溢出:创建大量对象并且对象生命周期很长情况时,会引发outofmemoryerror。
  
  方法区溢出:方法区存放class等元数据信息,如果产生大量的类(如CGLIB),会引发这种内存溢出,outofmemoryerror:permgen space,在使用hibernate等动态生成类框架时会引起这种情况。
  
  protected void Application_Start()
{
// Engine初始化
EngineContext.Initialize(www.078881.cn/ DataSettingsHelper.DatabaseIsInstalled());
// 添加自定义模型绑定
ModelBinders.Binders.Add(www.yongshi123.cn typeof(BaseModel), new AntiquatedModelBinder());
if (DataSettingsHelper.DatabaseIsInstalled(www.yongshiyule178.com))
{
// 清空mvc所有viewengines
ViewEngines.Engines.Clear();
// 注册自定义mvc viewengines
ViewEngines.Engines.Add(new ThemableRazorViewEngine());
}
// 自定义元数据验证
ModelMetadataProviders.Current = new AntiquatedMetadataProvider();

AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
DataAnnotationsModelValidatorProvider
.AddImplicitRequiredAttributeForValueTypes = false;
// 注册模型验证
ModelValidatorProviders.Providers.Add(
new FluentValidationModelValidatorProvider(new AntiquatedValidatorFactory()));
// 注册虚拟资源提供程序
var viewResolver = EngineContext.Current.Resolve<IAntiquatedViewResolver>();
var viewProvider = new ViewVirtualPathProvider(www.thd178.com viewResolver.GetEmbeddedViews());
HostingEnvironment.RegisterVirtualPathProvider(viewProvider);
}
复制代码
我们往往在做系统或者应用框架开发的时候,一般会去找基础框架给我们提供的合适切入点实现全局初始化。相信玩ASP.NET的朋友应该对Global.asax这个cs文件比较熟悉,或者说他的基类HttpApplication,大概说一下这个HttpApplication对象,HttpApplication的创建和处理时机是在运行时HttpRuntime之后,再往前一点就是IIS服务器容器了,所以HttpApplication就是我们要找的切入点。
EngineContext初看着命名挺唬人的,哈哈,其实还是比较简单的一个对象,我们暂时管它叫"核心对象上下文"吧,个人的一点小建议,我们在做应用框架的时候,最好能有这么一个核心对象来管理所有基础对象的生命周期。先上代码
复制代码
/// <summary>
/// 初始化engine核心对象
/// </summary>
/// <returns></returns>
[MethodImpl(MethodImplOptions.Synchronized)]
public static IEngine Initialize(bool databaseIsInstalled)
{
if (Singleton<IEngine>.Instance == null)
{
var config = ConfigurationManager.GetSection("AntiquatedConfig") as AntiquatedConfig;
Singleton<IEngine>.Instance = CreateEngineInstance(config);
Singleton<IEngine>.Instance.Initialize(config,
  
  吞吐量:指的是单位时间内完成的工作量的度量。
  
  响应时间:是提交请求和返回该请求的响应之间使用的时间。
  
  通常平均响应时间越短,系统吞吐量越大,平均响应时间越长,吞吐量越小。
  
  并行垃圾回收器关注的是吞吐量,会在一定程度上牺牲响应时间。可能某次请求会特别慢。
  
  并发垃圾回收器关注的是请求响应时间,会牺牲吞吐量。会尽量使得每次请求时间维持在差不多水平。
  
  对于CMS触发full gc的情况:
  
  old区使用到一定比例时触发,通过cmsinitiatingoccupancyfaction来设置。

JVM运行时内存组成分为一些线程私的更多相关文章

  1. JVM 运行时内存结构

      1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space ...

  2. JVM运行时内存结构

    原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...

  3. [转]JVM运行时内存结构

    [转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...

  4. 详细了解JVM运行时内存

    详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...

  5. JVM02——JVM运行时内存

    在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...

  6. 基础篇:JVM运行时内存布局

    目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...

  7. Jvm运行时内存解析

    一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...

  8. 【Java】关于JVM运行时内存空间、JVM垃圾回收机制

    参考的优秀文章 <深入理解Java虚拟机 JVM高级特性与最佳实线>(机械工业出版社) Java虚拟机的堆.栈.堆栈如何去理解? 聊聊JVM的年轻代 前言 本文是<深入理解Java虚 ...

  9. Java Core - JVM运行时内存管理

    在读正文之前,阅读以下两篇博客学习并理解堆栈.作用域.本地方法的概念. 作用域:https://www.cnblogs.com/AlanLee/p/6627949.html 操作数栈:https:// ...

随机推荐

  1. float与double

    对数值类型的细节了解在大学里就是一带而过,自己始终也没好好看过.这是在csdn上看到的一篇文章,挺好的,记录下来. https://blog.csdn.net/Demon__Hunter/articl ...

  2. CentOS6.9升级autoconf版本,解决”Autoconf version 2.64 or higher is required“错误

    安装软件时提示说需要Autoconf 2.64或更高的版本: # autoconf configure.ac:: error: Autoconf version 2.64 or higher is r ...

  3. USGS-EROS项目espa-surface-reflectance中的Landsat8 大气校正LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本(四)

    ,支持一些关键问题: 1    数据初始化问题.该问题是指在linux环境下编程标准c并编译,用户定义的变量默认初始值是0,但在windows 64 win7环境中,变量默认初始值是负值极小.... ...

  4. linux初学者常用必备命令整理

    Linux命令学习 1.文件&目录处理 ls -a 全部文件 -l 详细信息 -r 递归显示子目录结构 ls -al 相当于 ls -a -l cd ..上级目录 .当前目录 ~家目录 cd ...

  5. Sublime Text 3 常用插件 —— SFTP

    在 Win 下常用 Xftp 软件来和远程服务传递文件,但是要是在项目开发的时候频繁的将远程文件拖到本地编辑然后再传回远程服务器,那真是麻烦无比,但是Sublime中SFTP插件,它让这世界美好了许多 ...

  6. windows/Linux下的程序员文档浏览工具

    Dash + Alfred https://www.jianshu.com/p/77d2bf8df81f 对于程序员来说,查看api文档是非常频繁,经常窗口之间切换非常麻烦,mac下就有一个查文档的神 ...

  7. 报错:library not found for -lstdc++.6.0.9

    在Xcode 10开发中, 报错:library not found for -lstdc++.6.0.9 解决方案:将Xcode9的libstdc++6.0.9.tbd拷贝到Xcode10中使用 X ...

  8. mysql面试题

    01. 列举常见的关系型数据库和非关系型都有那些? 1.关系型数据库通过外键关联来建立表与表之间的关系,---------常见的有:SQLite.Oracle.mysql 2.非关系型数据库通常指数据 ...

  9. zabbix监控Oracle

    可监控项 使用zabbix监控oracle数据库需要借助第三方的插件,目前使用较多的是orabbix.目前维护到了1.2.3版本.关于oracle自带的监控项目有以下几个: DB Version (i ...

  10. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...