精华内容
下载资源
问答
  • 五大山的特点
    2019-09-29 18:19:16
    1950-1960年代的香港生活郁闷,治安恶劣。习武是当时流行的公余、课余的好活动。加上当年中国的解放,国内不小武术名家都到香港落地生根,香港当时武林确是百花齐放、百家争鸣也。
    同一时间在日本,一位受到日本空手道界排斥的空手道名家大山倍达为了测试自身的力量和宣扬其提倡的实战空手道,大山于1950年开始,分别与五十二头公牛 交战,结果三头当场死亡,有四十九头公牛的牛角被其以空手道手刀徒手砍掉。1952年间,大山倍达远赴美国多个地方,公开实地示范他所主张的武学。其间他 将所有270个对手全部击败,大部份他都以“一击必杀”的招式取得胜利。而每一场对决都在三分钟内分出胜负。有人如此评论大山倍达的威力:「对决时,当他 走近你,你就完了。没有人能抵御他的攻击。如你用手臂去抵挡他的拳,你的手臂必然折断,但如果你没有抵挡,那折断的必然是你身上的骨头或肋骨。」据说,他 能以拇指及食指扭曲十元硬币,更可以用徒手手刀一连劈断十四瓶威士忌瓶颈。正因大山倍达的惊人力量和技术,自此,人们都称他为 「神手:大山倍达」。可是大山倍达的不败神话被一位华夏武术家破灭了,他便是咏春拳讲手王,同时也是咏春拳学的始创人---黄淳梁师傅也!

    当时大山倍达也把他的失败记录在他的自传<<空手笨蛋一代>>中,大山师傅为了避免黄淳梁师傅成为武术界的目标而受到扰乱。他把黄淳梁师傅的角色改为一位太极拳高手叫陈老人。所以当今很多人以为香港陈家太极拳击败。

    由于极真会是有很名气,黄淳梁师傅为了不想令人误会他借打败大山倍达之名气以作自我宣传。所以极力避免向人提及打败大山倍达一事。

    今天各人相继作古,与其任由这段历史在时间流逝中渐渐空白,不如将过程真相公予同好。

    提起黄淳梁师傅,想必武术爱好者不会陌生。咏春拳讲手王黄淳梁一生中最少比武或踢馆过百次,真正是身经百战。当时香港武林盛极一时的踢馆、比武之风气,便 是黄淳梁师傅带起的。黄淳梁师傅的百次战役主要是在二十岁至二十四岁之间。对手包括各门各派之最高高手。当时黄淳梁师傅的比武事迹曾详细纪录在五十年代未 及六十年代初的红绿日报、晶报等报章之武林版之中。有兴趣的朋友可翻查当年旧报详阅。极真空手道始创人大山倍达当年在美国在找不到对手之下,有幸听到黄淳 梁的威名,受到吸引而来香港黄淳梁找师傅来作一个见证武林历史的 “交流”。

    双方坐定,先是寒暄一阵。随后大家谈到了武术。大山倍达对功夫颇不以为然。对咏春拳更是不屑一顾。黄淳梁师傅介绍,空手道其实也是中国的一武术之一,无法 完美地体现东方武术的特点。随后简单介绍了咏春拳的历史和现状。听晚黄师傅一席话,让大山倍达将信将疑,他主动要求“交流一下”。于是双方来到了训练场中 央。大山倍达首先表演了极真空手道的技术,这位日本空手道家拳脚犀利而且连环密不透风。接下来黄淳梁师傅演示了咏春拳的三套套路分别是:小念头、寻桥和标 指,并介绍了这些套路手法的一些用法。大山倍达似乎无法理解。双方便抄起拳靶来试一下力道。

    大山倍达不愧为日本空手道名家,他大喊一声,将黄淳梁师傅持握的手靶打得地动山摇。拳脚组合几乎没有什么破绽。黄淳梁师傅将略微靠近大山倍达,发 现大山倍达的力道减小了不少。像这种靠惯性力击打的搏击项目,遇到贴身紧逼,威力会大大减弱。黄淳梁师傅心中有了底。等轮到黄淳梁打靶时,一连几次,大山 倍达几乎接不住马师傅的发力,大山倍达的双臂被震得阵阵发麻。然后要求试手。黄淳梁师傅便与对手拉开了架势。

    大山倍达的进攻快速而凶猛。他一连串正拳突击被黄淳梁师傅的咏春黐手追打、迫打,如水银泻地,大山倍达无从反击,接着大山便用出了自己横行美国的 成名绝技:能够一连劈断十四瓶威士忌瓶颈手刀。但令这位极真空手道始创人大为不解的是,他面对美国选手所向披靡的手刀,在黄淳梁师傅面前根本不起作用。黄 淳梁师傅一个接劲,将大山倍达的双手互缚,大山倍达根本无法破解黄淳梁师傅的缚手。双方交叉换位,黄淳梁师傅已将大山倍达的双臂互缚,一个日字冲拳打过 去,大山倍达倒退几步,一屁股坐下撞坏了身后的木墙。黄师傅使用的是日字冲拳。像所有找黄淳梁师傅麻烦的人一样。大山倍达站起来再次向黄淳梁师傅猛扑过 来,黄淳梁不敢怠慢,一个日字冲拳打在在对手的心,另一日字冲拳打在大山倍达的鼻子上。大山倍达再次被击倒了出去,这次鼻子血流成河。这场友谊切磋到此结 束。

    事后,大山倍达怎么也不明白,为什么黄淳梁师傅的攻防技术如此美妙。他拍著黄淳梁师傅的肩膀说:惊人,非常强壮(惊くべきです、非常に强い.)。黄淳梁师傅凭借纯正的咏春拳法赢得了对方的信任,从此大家成为非常好的朋友。

    转载于:https://www.cnblogs.com/iRoy930/archive/2009/06/04/1581464.html

    更多相关内容
  • 大地形的气候特点

    千次阅读 2020-12-21 09:00:31
    1、大基本地形特点1、高原特征:海拔在500米以上;地势起伏不大,但是边缘陡峭;山峦起伏,凹凸不平。2、盆地特征:四周高,中间低。3、平原特征:海拔在200米以下;表面宽广zd,地平;分布在大河两岸和濒临海洋的...

    1、五大基本地形特点

    1、高原

    特征:海拔在500米以上;地势起伏不大,但是边缘陡峭;山峦起伏,凹凸不平。

    2、盆地

    特征:四周高,中间低。

    3、平原

    特征:海拔在200米以下;表面宽广zd,地平;分布在大河两岸和濒临海洋的地区。

    4、丘陵

    特征:海拔在200米—500米之间;坡度较缓;主要由低矮的山地组成。

    5、山地

    特征:海拔在500米以上;起伏很大,坡度陡峻,沟谷幽深,一般多呈脉状分布。

    (1)五大地形的气候特点扩展资料

    中国地势呈阶梯回状分布:

    1、地势的第一级阶梯是青藏高原和柴达木盆地,平均海拔在4000米以上。其北部与东部边缘分布有昆仑山脉、祁连山脉、横断山脉,是地势一、二级阶梯的分界线。

    2、地势的第二级阶梯上分布着大型的盆地和高原,平均海拔在1000—2000米之间,包括准噶尔盆地,塔里木盆地,内蒙古高原,黄土高原,四川盆地,云贵高原。其东面的大兴安岭、太行山脉、巫山、雪峰山是地势二、三级阶梯的分界线。

    3、地势的第三级阶梯上分布着广阔的平原,间有丘陵和低山,答包括东北平原,华北平原,长江中下游平原和辽东丘陵,山东丘陵和东南丘陵,其海拔多在500米以下。

    2、地形指的是什么

    地形指的是地表各种各样的形态,具体指地表 以上分布的固定性物体共同呈现出的高低起伏的各种状态。地形与地势、地貌不完全一样,地形偏向于局部结构,地势讲走向,地貌则一定是整体特征。如:鞍部是地形,山谷是地貌。按其形态可分为山地、高原、平原、丘陵和盆地五种类型。中国五大地形

    高原

    中国有四大高原:青藏高原、内蒙古高原、黄土高原、云贵高原。它们集中分布在地势第一、二级阶梯上。由于高度、位置、成因和受外力侵蚀作用不同,高原的外貌特征各异。特征:海拔在1000米以上;地势起伏不大,但是边缘陡峭;山峦起伏,凹凸不平。

    2. 盆地

    中国有四大盆地:塔里木盆地、柴达木盆地、四川盆地、准噶尔盆地。它们多分布在地势的第二级阶梯上,由于所在位置不同,其特点也不相同。 此外,著名的吐鲁番盆地也分布在地势第二级阶梯上,它是中国地势最低的盆地(-155米)。特征:四周高,中间低。

    3. 平原

    中国有三大平原:东北平原、华北平原、长江中下游平原。它们在中国东部地势第三级阶梯上。由于位置、成因、气候条件等各不相同,在地形上也各具特色。 以上三大平原南北相连,土壤肥沃,是中国最重要的农耕区。除此以外,中国还有成都平原、汾渭平原、珠江三角洲、台湾西部平原等,它们也都是重要的农耕区。特征:海拔在200米以下;表面宽广,地平;分布在大河两岸和濒临海洋的地区。

    4. 丘陵

    辽西丘陵,淮阳丘陵和江南丘陵。黄土高原上有黄土丘陵。长江中下游河段以南有江南丘陵。辽东,山东两半岛上的丘陵分布也很广。东南丘陵:我国东南部,包括江南丘陵、浙闽丘陵、两广丘陵等,面积最大地势东西差异大,主要位于第二、三级阶梯,东部平原、丘陵面积广大,长江中下游平原是我国地势最低的平原,河汊纵横交错,湖泊星罗棋布;江南丘陵是我国最大的丘陵,大多由东北-西南走向的低山和河谷盆地相间分布。特征:海拔在200米-500米之间;坡度较缓;主要由低矮的山地组成。

    5. 山地

    山岭和高地的统称。我国的山地大多分布在西部,喜马拉雅山、昆仑山、唐古拉山、天山、阿尔泰山都是著名的大山。

    特征:海拔在500米以上;起伏很大,坡度陡峻,沟谷幽深,一般多呈脉状分布。地形级别

    1. 独立地形

    独立地形是一级地形,并不从属于其它地形。例如,西欧平原并不从属于某个盆地。高原也如此。

    2. 从属地形

    是二级地形,五大地形除了高原之外,都有不同级别,上下级则包容。西伯利亚平原从属于西伯利亚盆地,松嫩平原从属于松辽盆地,江汉平原从属于两湖盆地。

    3、中国五大地形的定义

    平原和高原的共同特点是地面起伏小知;不同的是平原海拔较低,一般在200米以下,而高原海拔较高,边缘比较陡峭。山地和丘陵的共同特点是地道面崎岖不平;不同的是山地较高,海拔多在500米以上,坡度较陡,沟谷较深。而丘陵较低,相对高度一般不超过200米。盆地四周多被山地或高原环绕,中部相版对低平。权也有些盆地中部为起伏的丘陵,但比四周的山地.高原要低得多。完全是教科书内容,放心可信。

    4、五种基本地形特征

    山地,是指海拔在500米以上来的高地,起伏很大,坡度陡峻,沟谷幽深,一般多呈脉状分布。

    丘陵,一般海拔在200米以上,500米以下,相对高度一般不超过自200米,起伏不大,坡度较缓,由连绵不断的低矮山丘组成的。

    平原,是海拔较低的平坦的广大百地区,海拔多在0—500米,一般都在沿海地度区。

    高原,是高度一般在1000米以上,面积广大,地形开阔,周边以明显的陡坡为界,比较完整的大面积隆起地区。

    盆地,是四周高问(山地或高原)、中部低(平原或丘陵)的答盆状地形。盆地多分布在多山的地表上,在丘陵、山地、高原都有相应的不同构造的盆地。盆地基本呈中间低,四周高的盆状形态。

    5、五大地形的概念

    山地:海拔1000米以上的,与高原相对

    平原:海拔1000米以下的宽广平坦陆地

    丘陵:海拔1000米以下的有起伏的山丘

    高原:说白了,海拔1000米以上的平原

    盆地:就是被山围住的平原嘛~~

    6、五种地形的基本特征

    山地,是指海拔在500米以上的高地,起伏很大,坡度陡峻,沟谷幽深,一般多呈脉状分布。复

    丘陵,一般海拔在200米以上,500米以下,相对高度一般不超过200米,制起伏不大,坡度较缓,由连绵不断的低矮山丘组成的。

    平原,是海拔较低的平坦的广大地区,海拔多在0—500米,一般都在沿海地区。

    高原,是高度一般在1000米以上,面积广大,地形开阔,周边以明显的陡坡为界,比较完整的大面积隆起地区。

    盆地,是四周高(山地或高原)、中部低(平百原或丘陵)的盆状地形。盆地多分布在多山的地表上,在丘陵、山地、高原都有相应度的不同构造的盆地。盆地基本呈中间低,四周高的盆状形态。

    7、五种地形的等高线特点

    山地:等高线较密集,数来值在500米以上;

    丘陵:等高线较山地稀疏一些,源数值在500米以下

    高原:中间很稀疏,几乎没有,但边缘很稠密,数值一百般在度500米以上,多在100米以上。

    盆地:等高线四周稠密,数值多在500米以上,中间稀疏。知

    平原:等高线非常稀疏,数值一定在200米以下道。

    一般读此类图的思路。

    8、日本地形,气候,河流,主要城市及五大工业区

    百度知道

    日本位置,地形,气候,河流,文化背景。

    日本地形,气候,河流,主要城市及五大工业区

    日本地形,气候,河流,主要城市及五大工业区

    文字说明

    我来答共1条回答

    开心班主LV.92015-01-29

    1.地形:日本是一个多山的岛国,山地成脊状分布于日本的中央,将日本的国土分割为太平洋一侧和日本海一侧,山地和丘陵占总面积的71%,大多数山为火山。国土森林覆盖率高达67%。富士山是日本的最高峰,海拔3776米,是日本最高峰,被日本人尊称为:圣岳。

    日本群岛地处位于亚欧板块和太平洋板块的交界地带,即环太平洋火山地震带,火山、地震活动频繁,危害较大的地震平均3年就要发生1次。

    日本的平原主要分布在河流的下游近海一带,多为冲积平原,规模较小,较大的平原有石狩平原、越后平原、浓尾平原、十胜平原等,其中面积最大的平原为关东平原。日本平原面积狭小,耕地十分有限,人口生理密度高达2924人/平方公里,为世界第26位。

    2.气候:日本地处以温带和亚热带季风气候为主,气候温和、四季分明,具有海洋性典型特征。全国横跨纬度达25°,南北气温差异十分显著。

    北海道与本州的东北地区、高原地带属温带,本土大部地区及冲绳等南方诸岛则为亚热带。此外,日本所处位置令她受到季候风及洋流交汇的影响,因此四季分明、降水充沛。

    是世界上降水量较多的地区。主要原因包括了日本海侧地区冬季的降雪;6、7月(冲绳、奄美为5、6月)间连绵不断的梅雨;以及夏季到秋季登陆或接近日本的台风。日本有记载的最高温度纪录是40.9度,于2007年8月16日在崎玉县熊谷市和岐阜县多治见市测得;有记载的最低温度纪录是-41度,于1902年1月25日在北海道旭川市测得。

    3.河流:日本境内河流流程短水能资源丰富,最长的信浓川长约367公里;最大的湖泊是琵琶湖,面积672.8平方公里。

    4.日本主要城市:

    5:五大工业区:日本的工业主要集中在太平洋沿岸地区(太平洋沿岸带状工业地带)。主要有京滨(东京---横滨),名古屋(名古屋为中心),阪神(大阪--神户),濑户内(濑户内海沿岸)和北九州五大工业区。这种工业分布被称为“临海型”工业布局。

    9、五种基本地形

    14、五种基本地形的特点:

    平原:海拔较低,地面平坦;

    高原:海拔较高,地面坦荡,边缘陡峻;

    山地:海拔较高,峰峦起伏,坡度陡峻;

    丘陵:地面起伏,海拔不高,坡度和缓;

    盆地:周围高,中间低。

    10、五种主要地形类型

    五种主要地形类型:

    1、高原

    中国有四大高原:青藏高原、内蒙古高原、黄土高原、云贵高原。它们集中分布在地势第一、二级阶梯上。由于高度、位置、成因和受外力侵蚀作用不同,高原的外貌特征各异。特征:海拔在500米以上;地势起伏不大,但是边缘陡峭;山峦起伏,凹凸不平。

    2、盆地

    中国有四大盆地:塔里木盆地、柴达木盆地、四川盆地、准噶尔盆地。它们多分布在地势的第二级阶梯上,由于所在位置不同,其特点也不相同。 此外,著名的吐鲁番盆地也分布在地势第二级阶梯上,它是中国地势最低的盆地(-155米)。特征:四周高,中间低。

    3、平原

    中国有三大平原:东北平原、华北平原、长江中下游平原。它们在中国东部地势第三级阶梯上。由于位置、成因、气候条件等各不相同,在地形上也各具特色。

    4、丘陵

    中国有三大丘陵:辽西丘陵,淮阳丘陵与江南丘陵。黄土高原上有黄土丘陵。长江中下游河段以南有江南丘陵。辽东,山东两半岛上的丘陵分布也很广。

    4、山地

    山岭和高地的统称。我国的山地大多分布在西部,喜马拉雅山、昆仑山、唐古拉山、天山、阿尔泰山都是著名的大山。特征:海拔在500米以上;起伏很大,坡度陡峻,沟谷幽深,一般多呈脉状分布。

    (10)五大地形的气候特点扩展资料:

    中国地势呈阶梯状分布:

    1、地势的第一级阶梯是青藏高原和柴达木盆地,平均海拔在4000米以上。其北部与东部边缘分布有昆仑山脉、祁连山脉、横断山脉,是地势一、二级阶梯的分界线。

    2、地势的第二级阶梯上分布着大型的盆地和高原,平均海拔在1000—2000米之间,包括准噶尔盆地,塔里木盆地,内蒙古高原,黄土高原,四川盆地,云贵高原。其东面的大兴安岭、太行山脉、巫山、雪峰山是地势二、三级阶梯的分界线。

    3、地势的第三级阶梯上分布着广阔的平原,间有丘陵和低山,包括东北平原,华北平原,长江中下游平原和辽东丘陵,山东丘陵和东南丘陵,其海拔多在500米以下。

    展开全文
  • 在这个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。...

    JVM往期系列:

    大家好,我是楼仔!JVM系列是我去年写的,整个学习周期是一个半月,作为Java必备技能之一,非常重要,所以感觉有必要对之前的JVM系列重新整理,单独出一篇文章。

    JVM的学习轨迹,可以先通过该文章学习,然后对照《深入理解Java虚拟机》书籍把重点知识过一遍,最后最好能实战一下,下面是文章目录:

    类的加载过程

    加载过程介绍

    如果 JVM 想要执行这个 .class 文件,我们需要将其装进一个类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进JVM里面来。

    重点知识:

    • Java文件经过编译后变成 .class 字节码文件

    • 字节码文件通过类加载器被搬运到 JVM 虚拟机中

    • 虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行。

    类加载流程

    类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。

    • 加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象

    • 连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用

    • 初始化,为类的静态变量赋予正确的初始值

    • 使用,new出对象程序中使用

    • 卸载,执行垃圾回收

    类加载器

    加载一个Class类的顺序也是有优先级的,类加载器从最底层开始往上的顺序是这样的:

    • BootStrap ClassLoader:rt.jar

    • Extention ClassLoader: 加载扩展的jar包

    • App ClassLoader:指定的classpath下面的jar包

    • Custom ClassLoader:自定义的类加载器

    垃圾回收

    如何确定对象已死

    通常,判断一个对象是否被销毁有两种方法:

    • 引用计数算法: 为对象添加一个引用计数器,每当对象在一个地方被引用,则该计数器加1;每当对象引用失效时,计数器减1。但计数器为0的时候,就表白该对象没有被引用。

    • 可达性分析算法: 通过一系列被称之为“GC Roots”的根节点开始,沿着引用链进行搜索,凡是在引用链上的对象都不会被回收。

    就像上图的那样,绿色部分的对象都在GC Roots的引用链上,就不会被垃圾回收器回收,灰色部分的对象没有在引用链上,自然就被判定为可回收对象。

    垃圾回收算法

    标记--清除算法

    见名知义,标记--清除算法就是对无效的对象进行标记,然后清除。

    复制算法

    标记--复制算法就是把Java堆分成两块,每次垃圾回收时只使用其中一块,然后把存活的对象全部移动到另一块区域。

    标记--整理算法

    标记--整理算法算是一种折中的垃圾收集算法,在对象标记的过程,和前面两个执行的是一样步骤。但是,进行标记之后,存活的对象会移动到堆的一端,然后直接清理存活对象以外的区域就可以了。这样,既避免了内存碎片,也不存在堆空间浪费的说法了。但是,每次进行垃圾回收的时候,都要暂停所有的用户线程,特别是对老年代的对象回收,则需要更长的回收时间,这对用户体验是非常不好的。

    垃圾收集器

    Serial收集器

    Serial收集器是最基础、历史最悠久的收集器,是一个单线程工作的收集器,使用 Serial收集器,无论是进行 Minor gc 还是 Full GC ,清理堆空间时,所有的应用线程都会被暂停。

    ParNew收集器

    ParNew 收集器实质上是 Serial 收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为包括 Serial 收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与 Serial 收集器完全一致。

    Parallel Scavenge收集器

    Parallel Scavenge收集器也是一款新生代收集器,基于标记——复制算法实现,能够并行收集的多线程收集器和 ParNew 非常相似。

    Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值。如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

    Serial Old收集器

    Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。

    Parallel Old收集器

    Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。

    CMS收集器

    CMS 收集器设计的初衷是为了消除 Parallel 收集器和 Serial 收集器 Full gc 周期中的长时间停顿。CMS收集器在 Minor gc 时会暂停所有的应用线程,并以多线程的方式进行垃圾回收。

    垃圾收集器对比

    运行时数据区域

    什么是运行时数据区域?

    Java程序在运行时,会为JVM单独划出一块内存区域,而这块内存区域又可以再次划分出一块运行时数据区,运行时数据区域大致可以分为五个部分:

    Java堆(Heap)

    栈管运行,堆管存储。则虚拟机栈负责运行代码,而虚拟机堆负责存储数据。

    Java堆区具有下面几个特点:

    • 存储的是我们new来的对象,不存放基本类型和对象引用。

    • 由于创建了大量的对象,垃圾回收器主要工作在这块区域。

    • 线程共享区域,因此是线程不安全的。

    • 能够发生OutOfMemoryError。

    其实,Java堆区还可以划分为新生代和老年代,新生代又可以进一步划分为Eden区、Survivor 1区、Survivor 2区。

    虚拟机栈(JVM Stacks)

    Java虚拟机栈也是一块被开发者重点关注的地方,同样,先把干货放上来:

    • Java虚拟机栈是线程私有的,每一个线程都有独享一个虚拟机栈,它的生命周期与线程相同。

    • 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

    • 存放基本数据类型(boolean、byte、char、short、int、float、long、double)以及对象的引用(reference类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

    • 这个区域可能有两种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。

    本地方法栈(Native Method Stacks)

    本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

    虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

    方法区(Method Area)

    方法区也是一块被重点关注的区域,主要特点如下:

    • 线程共享区域,因此这是线程不安全的区域。

    • 它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    • 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

    程序计数器(Program Counter Register)

    它的作用就是记录当前线程所执行的位置。 这样,当线程重新获得CPU的执行权的时候,就直接从记录的位置开始执行,分支、循环、跳转、异常处理也都依赖这个程序计数器来完成。

    JVM堆内存

    堆内存结构

    Java堆区可以划分为新生代和老年代,新生代又可以进一步划分为Eden区、Survivor 1区、Survivor 2区。具体比例参数的话,可以看一下这张图。

    GC类型

    • Minor GC/Young GC:针对新生代的垃圾收集;

    • Major GC/Old GC:针对老年代的垃圾收集。

    • Full GC:针对整个Java堆以及方法区的垃圾收集。

    Minor GC工作原理

    通常情况下,初次被创建的对象存放在新生代的Eden区,当第一次触发Minor GC,Eden区存活的对象被转移到Survivor区的某一块区域。以后再次触发Minor GC的时候,Eden区的对象连同一块Survivor区的对象一起,被转移到了另一块Survivor区。可以看到,这两块Survivor区我们每一次只使用其中的一块,这样也仅仅是浪费了一块Survivor区。

    Full GC工作原理

    老年代是存储长期存活的对象的,占满时就会触发我们最常听说的Full GC,期间会停止所有线程等待GC的完成。所以对于响应要求高的应用应该尽量去减少发生Full GC从而避免响应超时的问题。

    GC日志

    GC日志开启

    偷个懒,直接贴网上的内容:

    理解GC日志

    Minor GC日志:

    Full GC日志:

    JVM常用命令

    Sun JDK监控和故障处理命令有jps、jstat、jmap、jhat、jstack、jinfo

    jps

    JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。

    jstat

    jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

    jmap

    dump堆到文件,可用于对文件的分析。

    jhat

    jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

    jstack

    jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

    性能检测工具

    jconsole

    Jconsole(Java Monitoring and Management Console)是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监测工具。jconsole使用jvm的扩展机制获取并展示虚拟机中运行的应用程序的性能和资源消耗等信息。

    概览:包括堆内存使用情况、线程、类、CPU使用情况四项信息的曲线图。

    线程:相当于可视化的jstack命令,同时也可以点击“检测死锁”来检查线程之间是否有死锁的情况。

    VisualVM

    VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。

    相比一些第三方工具,VisualVM有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性能的影响也较小,使得它可以直接应用在生产环境中。

    Visual GC 是常常使用的一个功能,需要通过插件按照,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等,感觉这个插件很酷!

    监控的主页其实也就是,cpu、内存、类、线程的图表,这里面可以执行堆dump。

    最后就是堆dump:

    JVM调优

    选择合适的垃圾回收器

    • CPU单核,那么毫无疑问Serial 垃圾收集器是你唯一的选择。

    • CPU多核,关注吞吐量 ,那么选择PS+PO组合。

    • CPU多核,关注用户停顿时间,JDK版本1.6或者1.7,那么选择CMS。

    • CPU多核,关注用户停顿时间,JDK1.8及以上,JVM可用内存6G以上,那么选择G1。

    参数配置:

     //设置Serial垃圾收集器(新生代)
     开启:-XX:+UseSerialGC
     ​
     //设置PS+PO,新生代使用功能Parallel Scavenge 老年代将会使用Parallel Old收集器
     开启 -XX:+UseParallelOldGC
     ​
     //CMS垃圾收集器(老年代)
     开启 -XX:+UseConcMarkSweepGC
     ​
     //设置G1垃圾收集器
     开启 -XX:+UseG1GC
    

    调整内存大小

    现象:垃圾收集频率非常频繁。

    原因:如果内存太小,就会导致频繁的需要进行垃圾收集才能释放出足够的空间来创建新的对象,所以增加堆内存大小的效果是非常显而易见的。

    注意:如果垃圾收集次数非常频繁,但是每次能回收的对象非常少,那么这个时候并非内存太小,而可能是内存泄露导致对象无法回收,从而造成频繁GC。

    参数配置:

     //设置堆初始值
     指令1:-Xms2g
     指令2:-XX:InitialHeapSize=2048m
     ​
     //设置堆区最大值
     指令1:`-Xmx2g` 
     指令2: -XX:MaxHeapSize=2048m
     ​
     //新生代内存配置
     指令1:-Xmn512m
     指令2:-XX:MaxNewSize=512m
    

    设置符合预期的停顿时间

    现象:程序间接性的卡顿

    原因:如果没有确切的停顿时间设定,垃圾收集器以吞吐量为主,那么垃圾收集时间就会不稳定。

    注意:不要设置不切实际的停顿时间,单次时间越短也意味着需要更多的GC次数才能回收完原有数量的垃圾.

    参数配置:

     //GC停顿时间,垃圾收集器会尝试用各种手段达到这个时间
     -XX:MaxGCPauseMillis 
    

    调整内存区域大小比率

    现象:某一个区域的GC频繁,其他都正常。

    原因:如果对应区域空间不足,导致需要频繁GC来释放空间,在JVM堆内存无法增加的情况下,可以调整对应区域的大小比率。

    注意:也许并非空间不足,而是因为内存泄造成内存无法回收。从而导致GC频繁。

    参数配置:

     //survivor区和Eden区大小比率
     指令:-XX:SurvivorRatio=6  //S区和Eden区占新生代比率为1:6,两个S区2:6
     ​
     //新生代和老年代的占比
     -XX:NewRatio=4  //表示新生代:老年代 = 1:4 即老年代占整个堆的4/5;默认值=2
    

    调整对象升老年代的年龄

    现象:老年代频繁GC,每次回收的对象很多。

    原因:如果升代年龄小,新生代的对象很快就进入老年代了,导致老年代对象变多,而这些对象其实在随后的很短时间内就可以回收,这时候可以调整对象的升级代年龄,让对象不那么容易进入老年代解决老年代空间不足频繁GC问题。

    注意:增加了年龄之后,这些对象在新生代的时间会变长可能导致新生代的GC频率增加,并且频繁复制这些对象新生的GC时间也可能变长。

    配置参数:

    //进入老年代最小的GC年龄,年轻代对象转换为老年代对象最小年龄值,默认值7
     -XX:InitialTenuringThreshol=7 
    

    调整大对象的标准

    现象:老年代频繁GC,每次回收的对象很多,而且单个对象的体积都比较大。

    原因:如果大量的大对象直接分配到老年代,导致老年代容易被填满而造成频繁GC,可设置对象直接进入老年代的标准。

    注意:这些大对象进入新生代后可能会使新生代的GC频率和时间增加。

    配置参数:

     //新生代可容纳的最大对象,大于则直接会分配到老年代,0代表没有限制。
      -XX:PretenureSizeThreshold=1000000 
    

    调整GC的触发时机

    现象:CMS,G1 经常 Full GC,程序卡顿严重。

    原因:G1和CMS 部分GC阶段是并发进行的,业务线程和垃圾收集线程一起工作,也就说明垃圾收集的过程中业务线程会生成新的对象,所以在GC的时候需要预留一部分内存空间来容纳新产生的对象,如果这个时候内存空间不足以容纳新产生的对象,那么JVM就会停止并发收集暂停所有业务线程(STW)来保证垃圾收集的正常运行。这个时候可以调整GC触发的时机(比如在老年代占用60%就触发GC),这样就可以预留足够的空间来让业务线程创建的对象有足够的空间分配。

    注意:提早触发GC会增加老年代GC的频率。

    配置参数:

     //使用多少比例的老年代后开始CMS收集,默认是68%,如果频繁发生SerialOld卡顿,应该调小
     -XX:CMSInitiatingOccupancyFraction
     ​
     //G1混合垃圾回收周期中要包括的旧区域设置占用率阈值。默认占用率为 65%
     -XX:G1MixedGCLiveThresholdPercent=65 
    

    调整 JVM本地内存大小

    现象:GC的次数、时间和回收的对象都正常,堆内存空间充足,但是报OOM

    原因: JVM除了堆内存之外还有一块堆外内存,这片内存也叫本地内存,可是这块内存区域不足了并不会主动触发GC,只有在堆内存区域触发的时候顺带会把本地内存回收了,而一旦本地内存分配不足就会直接报OOM异常。

    注意: 本地内存异常的时候除了上面的现象之外,异常信息可能是OutOfMemoryError:Direct buffer memory。 解决方式除了调整本地内存大小之外,也可以在出现此异常时进行捕获,手动触发GC(System.gc())。

    配置参数:

     XX:MaxDirectMemorySize
    

    JVM调试实战

    网站流量浏览量暴增后,网站反应页面响很慢

    1、问题推测:在测试环境测速度比较快,但是一到生产就变慢,所以推测可能是因为垃圾收集导致的业务线程停顿。

    2、定位:为了确认推测的正确性,在线上通过jstat -gc 指令 看到JVM进行GC 次数频率非常高,GC所占用的时间非常长,所以基本推断就是因为GC频率非常高,所以导致业务线程经常停顿,从而造成网页反应很慢。

    3、解决方案:因为网页访问量很高,所以对象创建速度非常快,导致堆内存容易填满从而频繁GC,所以这里问题在于新生代内存太小,所以这里可以增加JVM内存就行了,所以初步从原来的2G内存增加到16G内存。

    4、第二个问题:增加内存后的确平常的请求比较快了,但是又出现了另外一个问题,就是不定期的会间断性的卡顿,而且单次卡顿的时间要比之前要长很多。

    5、问题推测:练习到是之前的优化加大了内存,所以推测可能是因为内存加大了,从而导致单次GC的时间变长从而导致间接性的卡顿。

    6、定位:还是通过jstat -gc 指令 查看到 的确FGC次数并不是很高,但是花费在FGC上的时间是非常高的,根据GC日志 查看到单次FGC的时间有达到几十秒的。

    7、解决方案: 因为JVM默认使用的是PS+PO的组合,PS+PO垃圾标记和收集阶段都是STW,所以内存加大了之后,需要进行垃圾回收的时间就变长了,所以这里要想避免单次GC时间过长,所以需要更换并发类的收集器,因为当前的JDK版本为1.7,所以最后选择CMS垃圾收集器,根据之前垃圾收集情况设置了一个预期的停顿的时间,上线后网站再也没有了卡顿问题。

    后台导出数据引发的OOM

    **问题描述:**公司的后台系统,偶发性的引发OOM异常,堆内存溢出。

    1、因为是偶发性的,所以第一次简单的认为就是堆内存不足导致,所以单方面的加大了堆内存从4G调整到8G。

    2、但是问题依然没有解决,只能从堆内存信息下手,通过开启了-XX:+HeapDumpOnOutOfMemoryError参数 获得堆内存的dump文件。

    3、VisualVM 对 堆dump文件进行分析,通过VisualVM查看到占用内存最大的对象是String对象,本来想跟踪着String对象找到其引用的地方,但dump文件太大,跟踪进去的时候总是卡死,而String对象占用比较多也比较正常,最开始也没有认定就是这里的问题,于是就从线程信息里面找突破点。

    4、通过线程进行分析,先找到了几个正在运行的业务线程,然后逐一跟进业务线程看了下代码,发现有个引起我注意的方法,导出订单信息。

    5、因为订单信息导出这个方法可能会有几万的数据量,首先要从数据库里面查询出来订单信息,然后把订单信息生成excel,这个过程会产生大量的String对象。

    6、为了验证自己的猜想,于是准备登录后台去测试下,结果在测试的过程中发现到处订单的按钮前端居然没有做点击后按钮置灰交互事件,结果按钮可以一直点,因为导出订单数据本来就非常慢,使用的人员可能发现点击后很久后页面都没反应,结果就一直点,结果就大量的请求进入到后台,堆内存产生了大量的订单对象和EXCEL对象,而且方法执行非常慢,导致这一段时间内这些对象都无法被回收,所以最终导致内存溢出。

    7、知道了问题就容易解决了,最终没有调整任何JVM参数,只是在前端的导出订单按钮上加上了置灰状态,等后端响应之后按钮才可以进行点击,然后减少了查询订单信息的非必要字段来减少生成对象的体积,然后问题就解决了。

    学习心得

    我感觉其实通过博客学习这块知识其实就够了,因为博客中的知识直击JVM的靶心,基本都是干货,但是对于一些实际的场景用例,博客给的示例不多,这个是通过博客学习唯一的缺点。

    通过《深入理解Java虚拟机》书籍学习JVM知识,真的感觉这本书太厚了,不建议新人学习,因为这本书也就前5章的内容比较干货,后面的大部分知识可以直接跳过,或者作为选学的知识,比如你学习书籍中的“虚拟机字节码执行引擎”、“前端编译与优化”等章节,我感觉这些知识完全没有学习的必要,都是些“八股文”,完全可以等需要的时候再学。

    建议将书籍作为博客学习的补充,因为里面很多的实战示例还是非常不错的,然后有些重点知识,书中也讲解的非常详细,比如“垃圾收集器”。

    尽信书则不如无书,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激。

    展开全文
  • 笔者将详细描述这“三座大山”,希望能抛砖引玉,促进国内同行之间的交流讨论,为功能安全在国内推广普及贡献一丝力量。 1 序言 功能安全在汽车行业突然走红可以追溯到2016年。当时,大大小小的造车新...

    导读:

    本文由汽车电子与软件授权发布,作者为刘钊江。

    如果说实践是检验真理的唯一标准,那么量产是检验功能安全落地的唯一标准。基于此,笔者根据以往的项目经验,总结了现阶段功能安全量产落地的三大主要困难,取名为“三座大山”。这“三座大山”是融合与平衡、周期与成本、理论与实践。笔者将详细描述这“三座大山”,希望能抛砖引玉,促进国内同行之间的交流讨论,为功能安全在国内推广普及贡献一丝力量。

     

     

    1

    序言

     

    功能安全在汽车行业突然走红可以追溯到2016年。当时,大大小小的造车新势力如雨后春笋般层出不穷,汽车行业在技术革命的浪潮中呈现出一派欣欣向荣景象,也带红了实际上早在2011年就发布的ISO 26262标准。功能安全一时间风头无两,谈新能源、谈智能网联就必谈功能安全。

     

    Image

     

    经过17、18、19三年,国内各大主机厂和零部件供应商基本上都试着进行了功能安全的引进和导入。即便没有完整的走完一轮,但起码都或多或少的试过水。然而到了2020年,能够真正实现功能安全量产落地的国内企业却寥寥无几。

     

    大家对功能安全的普遍反映包括:

     

    • “太虚了。”

    • “流程太复杂,做起来很麻烦。”

    • “项目太紧,没有资源去做。”

    • “技术指标要求太高,做不到。”

    • “动不动就进安全状态,车没法开了。”

    • ……

     

    作为一名从2012年开始担任功能安全岗位的老兵,笔者先后待过两个不同的行业。坦率的说,有国家/政府/行业强制要求的话,功能安全更容易推动一些。比如说在欧洲、尤其是在德国,所有产品都受到《产品责任法》管辖。该法规定,产品的销售和展示,不管是被预期使用,还是被可预见的误用,都不能损害个人安全、健康以及其它公众利益,否则就是违法行为。零部件制造商、供应商必须向OEM和监管机构证明其产品满足所要求的安全功能,不存在由于产品缺陷而引起的失效风险,并且在设计研发过程中使用了最先进的技术。也就是说,产品制造商负有举证责任。在这种大环境下,功能安全非常普及。

     

    但国家/政府/行业强制并不是功能安全量产落地的根本原因,这只是表象。笔者认为,起源于欧洲、尤其是德、法等发达国家的功能安全,是建立在其国家发展实际情况基础之上的,这包括社会文化、经济水平、工业基础等各个方面。事实上,发达国家已经针对工业控制的各个子行业,建立了完善的功能安全标准体系。这说明了什么?这说明,功能安全标准本质上其实是一种生产关系的反映,它必须与生产力相匹配才能落地生根。所以,功能安全在不同国家的推广进程肯定是不一样的,每个国家都有自己的国情。功能安全想要在国内企业落地,就必须适配国内企业的实际情况,同时国内企业也有一些方面需要调整,双方都往中间靠拢,最终才可能汇合。

     

    Image

     

    话虽如此,但实际做起来又哪有那么容易?接触过功能安全的人都知道,功能安全有以下几个特点:

     

    • 基于流程驱动,包括需求开发、架构设计、详细设计、实现、集成、测试验证、确认等环节,在每个环节都有相应的技术要求;

    • 覆盖产品的全生命周期,包括策划、概念、设计、验证、生产、运行一直到报废;

    • 覆盖电子电气的各个方面,包括传感器、处理器、执行器、硬件电路、基础软件、应用软件、芯片、软件工具等;

    • 覆盖影响上述内容的支持过程,包括项目管理、安全管理、需求管理、配置管理、变更管理、生产管理、售后服务管理等。

     

    Image

     

    可以看到,功能安全是一个系统的、完整的体系,内部逻辑非常严谨,环环相扣。对其中任何一个部分进行调整,都有可能造成整体性逻辑链条的损害或缺失。任何局部的改动,都必须从整体上来考虑,否则就有可能形成逻辑上的漏洞。想想也是,ISO 26262标准从2005年开始制定,在6年后、也就是2011年发布了第一版,又在7年后、也就是2018年发布了第二版,它已经很成熟了。所以,要想让ISO 26262标准适配国内企业的实际情况,需要国内整个行业的共同努力,大家一起学习、讨论、提炼、调整、完善,才有可能让ISO 26262真正在国内落地生根。

     

    Image

     

    这几年项目做下来,笔者也遇到过大大小小的问题,有的已经解决了,有的还在想办法解决。如果说实践是检验真理的唯一标准,那么量产是检验功能安全落地的唯一标准。基于此,笔者根据以往的项目经验,总结了现阶段功能安全量产落地的三大主要困难,取名为“三座大山”。它们是:

     

    • 融合与平衡

    • 周期与成本

    • 理论与实践

     

    笔者将详细描述这“三座大山”,希望能抛砖引玉,促进国内同行之间的交流讨论,为功能安全在国内推广普及贡献一丝力量。

     

    2

    融合与平衡

     

    2.1 融合的必要性

     

    在某些行业比如轨道交通、过程工业等,安全防护设备(如SIS)和常规控制设备(如DCS)常常是分开的。也就是说,它们在物理上是独立的实体。从系统自顶向下分解而来的安全功能,基本上都由安全防护设备来承担,而安全防护设备基本上也只承担安全功能。功能安全只针对安全防护设备,以及安全防护设备和常规控制设备的系统集成。这样的系统架构泾渭分明,非常清晰,也比较容易理解。

     

    Image

     

    然而在汽车行业就不一样了,安全功能和非安全功能常常是由同一个设备来承担的。不管是为了降低产品成本,还是为了节省布置空间,除了个别情况下使用ASIL分解来隔离安全功能和非安全功能外,总体上而言,我们面临的项目基本上都是需要ASIL和QM混合开发的,ASIL的内容只是项目的一部分。所以,功能安全永远是也只能是产品的一部分。笔者认为,这是汽车功能安全从业人员首先需要端正的态度和认识。

     

    Image

     

    由于ISO26262标准自身非常完备,功能安全工程师很容易产生一种错觉:我已经有了葵花宝典,还要紫霞神功干啥?这种观点其实大错特错。首先,你误解了ISO 26262标准的真正含义,这一点后文会讲到。其次,你有没有想过:在目前没有国家/政府/行业强制要求的情况下,产品研发可以不导入功能安全。

     

    但反过来却完全不同,要导入功能安全必须依托产品研发。也就是说,功能安全必须与现有的产品研发融合,才有落地的可能。其中包括:

     

    • 安全管理流程与现有产品流程融合;

    • 安全需求开发与现有产品需求融合;

    • 安全架构设计与现有产品架构融合;

    • 安全软件设计与现有产品软件融合;

    • ……

     

    这里笔者想着重强调一下“现有”,是因为大多数企业在导入功能安全之前,基本上都已经有自己的产品或者产品原型了。甚至说该产品是可以投放市场的,只不过没有按照功能安全标准的要求进行研发而已。也就是说,先有常规控制,后有功能安全,这是汽车功能安全项目面临的普遍情况。既然功能安全是后来的,那么就应该主动的融合到现有的产品当中去。导入功能安全不是为了推翻和颠覆,而是为了继承和发扬,在与现有产品融合的过程中对其施行必要的改进和优化,这样才能以最少的成本将功能安全落地。

     

    2.2 案例分享

     

    给大家分享一个笔者在实际项目中遇到的案例。如图所示,信号传输路径为:传感器-->采集板-->主控板-->执行器。对于传感器的电路故障(开路、短路)诊断,一般放在采集板实施,这个通常没有异议。但对于传感器的合理性故障诊断,可以放在采集板,也可以放在主控板,这两种方式都不违背功能安全的原则。

     

    Image

     

    到底哪种方式更合理,其实很大程度上取决于现有产品的设计。也就是说,在导入功能安全之前,主控板和采集板的分工是什么?采集板有没有协助主控板进行算法处理,还是单纯的采集和传输?采集板有没有开发软件标定功能?主控板和采集板之间的通信带宽是否允许传输更多的原始数据,还是只能增加一些故障信息?主控板和采集板的硬件余量(RAM空间、ROM空间、CPU负载率等)分别还有多大?……这些都是需要考虑的因素。笔者最后综合考虑各方面因素,选择了在主控板完成对传感器的合理性故障诊断。

     

    2.3 实施建议

     

    既然与现有产品融合如此重要,那么到底应该怎么做呢?ISO 26262标准里其实提供了一个解决方案:从现有产品研发中获得输入。下面是几个例子:

     

    • 开发FSC需要的输入:

    Image

     

    • 开发TSC需要的输入:

    Image

     

    • 开发HSR需要的输入:

    Image

     

    • 开发SSR需要的输入:

    Image

     

    以上这些内容可能平日里大家关注没那么多,但事实上ISO 26262标准隐含的要求就是功能安全要与现有产品相融合。这个思路本身挺好,但在项目实际过程中,常常会遇到另一个现实问题:现有产品文档严重缺失,无法提供关键有效的输入。稍微夸张一点说,它就是一个黑盒。这种情况下,就算功能安全想要主动去融合,实际操作起来也有很大的困难。所以,现有产品研发流程体系越完善,功能安全越容易落地。一般来说,如果CMMI或者A-SPICE达到Level 3,可以认为产品研发流程体系比较完善。

    Image

     

    遇到上面这种情况怎么办?其实也没有更好的办法,只能是功能安全工程师投入更多的时间、精力,通过调查、访谈、甚至是逆向工程等方法,将缺失的信息补上。毕竟,与现有产品实现融合并不意味着功能安全就能量产落地,这只是需要解决的问题之一。但是,放弃与现有产品的融合就意味着功能安全的导入必然以失败而告终,这一点毋庸置疑。

     

    2.4 平衡的必要性

     

    在功能安全与现有产品融合的过程中,不可避免的会遇到平衡的问题。所以,笔者将融合与平衡放在一起论述。 

     

    什么是平衡问题?很多功能安全工程师在项目实施过程中,自始至终的关注点都是安全目标能不能实现、会不会违背,安全性非常重要、甚至高于一切。从功能安全的角度出发,这是理所应当的做法。但是对于整个项目而言,安全性只是产品的属性之一。除了安全性之外,我们耳熟能详的产品属性还包括可用性、可靠性、可维护性、可测试性、可扩展性、可移植性、可重用性……,这些都是产品研发需要考虑的方面。所以,最终的产品设计,一定是各个方面综合考虑、折中平衡的结果。

     

    Image

     

    很多功能安全工程师都有过切身经历,就是在项目组中常常要和别人“吵架”,有的时候甚至要争论很久才能达成一致。这其实就是平衡问题的现实反映:每个人都有自己的立场,每个人都希望自己的观点能够变成最终结论,而其他人能够接受自己的观点,并为之做出让步和妥协。

     

    但现实情况哪可能如此理想?你眼中的人命关天,别人可能根本就不理解、不接受,甚至都不关心。所以,对功能安全工程师来说,沟通能力非常重要。因为你需要不断的说服别人,上到管理层、下到普通员工,都可能是你需要说服的对象。如果你只会特别强硬的坚持自己的观点,最后很可能就是你一个人站在所有人的对立面,结局可想而知。

     

    Image

     

    除了加强沟通之外,我们也可以尝试换位思考一下:为什么会有这么多反对的声音?有没有可能是我们的立场太狭隘、视角太片面呢?有句话叫“不忘初心,方得始终”。我们做功能安全的初衷是什么?是为了降低产品风险,防止人员伤亡。但我们不能忽略一个事实:产品是由企业研发、生产、制造、销售和维护的,产品可能造成人员伤亡的前提是有用户使用该产品。

     

    Image

    我们来设想一些极端的例子:

     

    • 一架永不起降的飞机;

    • 一列永不出站的火车;

    • 一辆永不发动的汽车;

    • 一台永不运行的X光机;

    • ……

     

    这些设备都非常安全,但是没有用!因为没有人使用它们。于是一个悖论出现了:

     

    Image

     

    当使用该产品的用户很少时,类似的悖论仍然有可能出现:

     

    Image

     

    如果真的遇到了上面这样的情况,你会不会产生自我怀疑?坚持了这么久的功能安全,到底有什么意义和价值?

     

    实际上,功能安全的意义和价值,是通过产品传递给用户的。产品首先需要销售给用户、让用户来使用,然后用户在使用产品的过程中可能会遇到由于电子电气故障引发的风险,这种风险可以通过功能安全来降低至合理水平。使用产品的用户越多,功能安全的意义和价值就越大。

     

    基于此,笔者想再次强调:功能安全永远是也只能是产品的一部分,安全性只是产品的属性之一。所以,功能安全工程师千万不要把自己局限在功能安全里面。实现功能安全没有什么了不起的,这本来就是你的职责所在。如果做不到,只能说明你还不够称职,还需要继续努力。但如果仅仅只是实现了功能安全,你可以称得上合格,但还谈不上优秀。真正牛逼的功能安全工程师,需要更上一层楼,站在产品的角度来看问题,在确保产品安全性的同时,平衡好安全性和产品其它属性的关系。

     

    2.5 案例分享

     

    给大家分享一个笔者在实际项目中遇到的案例。系统架构如图所示,MCU通过驱动器控制执行器,并且定时对SBC喂狗。安全目标对应的FTTI为3秒,而MCU复位一次的时间约为500毫秒。将SBC的延时切断设置为2秒,既不违背FTTI,又可以容许MCU多次复位,在保证安全性的同时提高可用性。

     

    Image

    2.6 实施建议

     

    如何解决平衡问题?笔者认为,首先是要树立全局意识。我们的目标决不是仅仅为产品的Safety负责,我们要为产品的Dependability负责。Dependability包括Reliability、Availability、Maintainability和Safety等RAMS的各个方面。这样慢慢的你就会站在更高的层面来看待功能安全,也就能更好的将功能安全融合到产品当中去。

     

    Image

     

    其次,需要具备灵活运用功能安全原理的能力,知其然并知其所以然,做到收放自如。如果只是生搬硬套、照本宣科,片面强调安全性,那就肯定无法平衡好产品的各个属性。这一点将在“理论与实践”部分再与大家详细讨论。

     

    3

    周期与成本

     

    3.1 交付周期的重要性

     

    我们先来看一些汽车企业高管的公开言论:

     

    在未来五年中,沃尔沃汽车公司将每年推出一款纯电动汽车,力争到2025年纯电动汽车占全球销量的50%,其余为混动车型。

    ——沃尔沃总裁兼首席执行官哈坎·萨缪尔森

     

    未来5年,通用汽车在全球推出的30款电动车型……通用汽车将提前完成12款全球电动车型的开发工作。

    ——通用汽车首席执行官玛丽·博拉

     

    以后,我们需要考虑新功能的发布周期,几天甚至几个小时,而不是几个月。

    ——戴姆勒研发部门首席信息官席格马尔·哈西

     

    大家感受到了吗?市场的节奏早就不再是以前三、四年推一款新车的那种沉稳的风格了。现在各大车企都在加快推出新车型,纯电领域已经基本做到了一年一款甚至多款新车。 

     

    从2012年的Model S搭载整车OTA技术以来,到现在特斯拉已经通过OTA为其推送了二三十次的大版本软件升级,其中涉及了人机交互、动力系统、自动驾驶等众多方面,完成了钥匙卡漏洞修复、续航里程提升、提高最高速度、提升乘坐舒适度等功能调整。这在传统的汽车研发流程里几乎是不可想象的。从某种角度而言,Model S的研发在其量产之后一直持续进行着,而且研发交付周期很短,因为软件更新频率很高。

     

    Image

     

    可能当初谁也不会想到,特斯拉,这家从美国硅谷横空出世的电动汽车制造商会以绝对领先的优势超越丰田、大众等传统车企巨鳄,成为全球市值最高的汽车制造商。不管你愿不愿意承认,事实上特斯拉已经取得了阶段性胜利,其采用的很多创新理念和技术正引领业界潮流。特斯拉从一个科技公司而非汽车公司的视角重新定义了电动汽车,使得各大车企感受到了巨大压力。

     

    市场竞争如此激烈,如果你不想被淘汰,就必须跟上节奏:

     

    • 快速交付产品,抢占市场;

    • 及时了解市场需求,根据用户偏好做出功能优化;

    • 迅速修复软件bug,提升售后服务效率;

    • ……

     

     

    于是,我们今天要讨论的问题就出现了:产品研发周期这么短,连常规控制功能的交付压力都如此之大,还怎么做功能安全?

     

    事实上交付周期对功能安全是一个巨大的挑战。众所周知,ISO 26262标准依照“V”模型将系统、软件、硬件等不同层面的工作组织到一起,严格来说在上一个阶段必须做足功课才能进入下一个阶段。这种模式很严谨,但也很死板。按部就班、步步为营的工作方式,可能真的无法适应需要快速交付产品的市场节奏。还记得笔者之前提到的悖论吗?如果你的产品失去了市场,那就意味着很少人会使用,于是也就不需要做什么功能安全了,因为人员伤亡风险很低。所以,功能安全也需要适应市场节奏,做到快速交付。

     

    3.2 案例分享

     

    在这几年的项目经历中,笔者已经不止一次遇到过由于赶不上SOP时间,暂缓或停止功能安全任务的事情了。这其实也能理解,先有常规控制,后有功能安全。如果连基本功能都不成熟的话,产品根本就达不到投放市场的条件,又怎么去抢占市场呢?所以产品交付肯定是第一位的。

     

    坦率的说,基于传统“V”模型来实施功能安全,在面对周期只有一年、甚至更短的项目时,笔者也没有太好的办法。笔者曾经尝试过将不同的安全任务并行穿插,比如说TSC开发和硬件FMEDA同步进行、SSR开发和软件编码同步进行等方式。但总的来说效果并不明显,因为项目周期实在是太短了,而“V”模型又很死板,在这个框架内能够做出的调整非常有限。所以笔者认为,必须采用一种快速的、灵活的开发模式,才有可能适应项目的交付要求。

     

    3.3 实施建议

     

    “物竞天择,适者生存”。今天连丰田、大众这样的传统汽车巨头都已经开始转型,时代真的变了。作为一名功能安全的学习者、思考者、实践者,笔者认为传统的功能安全开发方式已经不太适应新的市场环境,需要做出调整。而且随着互联网、IT等科技企业不断涌入汽车行业,笔者有一种强烈的预感:敏捷开发将逐渐成为汽车软件开发的主流方式,也将逐渐成为功能安全软件开发的主流方式。通过敏捷开发,功能安全(主要是软件)可以做到快速交付。这是一个很有意思的话题,有机会再与大家展开讨论。 

     

    3.4 导入功能安全的成本到底有多高

     

    前面我们讨论了交付周期,其实严格来说,交付周期也是成本的一种——时间成本。只不过在当前的市场环境下,交付周期的问题特别突出,所以有必要单独进行讨论。

     

    降低成本的重要性无需多言,不管是哪个行业、哪家公司,降本增效都是永恒的课题。但是汽车行业又有其特殊性——汽车是一个规模效益的产业,所以对汽车企业来说,销量非常关键。销量越大,均摊的成本就越低。而成本越低,在产品营销上就越有优势,销量就越能继续扩大。这是一个相互促进的过程。所以对于汽车产业而言,降低成本显得更为迫切。

     

    Image

     

    接触过功能安全的人都知道,功能安全的导入会给企业增加不少成本,包括:

     

    硬件成本

    • 高ASIL等级的安全功能常常需要增加冗余,也就是增加硬件组件

    • 核心芯片往往都需要经过功能安全认证,而且往往不止一个芯片

    • 硬件失效率不达标,需要更换可靠性更高/失效率更低的电子元器件

    • 硬件FMEDA及故障注入测试需要投入大量的时间精力,而且常常要反复好几轮…… 

     

     

    软件成本

    • 需要开发新的软件(承担安全功能)

    • 软件分区等措施的引入可能对原有软件架构影响很大,需要大改

    • 软件白盒测试的覆盖率指标要求很高,达不到的话需要返工

    • 增加很多安全机制有可能造成软件不稳定,需要大量时间来调试、修改、验证……

     

     

    工具链成本

    • 需求管理工具;

    • 安全分析工具;

    • 软件开发工具;

    • 软件测试工具……

     

     

    Image

    管理成本

    • 流程体系建立需要投入人力;

    • 项目安全管理需要投入人力;

    • 功能安全审计需要投入人力;

    • 功能安全评估(如有)需要投入人力……

     

     

     

     

    这一系列折算下来,保守估计也得上千万。而且这还主要是设计研发环节的统计,并没有包括产品的全生命周期。导入功能安全会引起成本上升这很正常,但如果增加的太多,很容易让人望而却步。尤其对于很多中小企业来说,可能基本的流程体系都还不健全,现金流压力也比较大。在这种情况下想要实施功能安全,往往需要面临更大的挑战。

     

    这一系列折算下来,保守估计也得上千万。而且这还主要是设计研发环节的统计,并没有包括产品的全生命周期。导入功能安全会引起成本上升这很正常,但如果增加的太多,很容易让人望而却步。尤其对于很多中小企业来说,可能基本的流程体系都还不健全,现金流压力也比较大。在这种情况下想要实施功能安全,往往需要面临更大的挑战。

     

    当然,对于上述这些成本,我们也应该辩证的来看:

     

    • 硬件BOM成本随着出货量增大而降低,而且现在芯片厂家提供的芯片很多都是经过功能安全认证的,不做功能安全反而没有“物尽其用”

    • 软件在首次开发时会遇到很多困难,但是只要成熟、稳定之后,就可以作为平台软件长期复用,尤其是基础软件模块,非常典型

    • 很多工具软件并不是实施功能安全才要求的,比如需求管理工具、软件测试工具等,只不过之前一直没有,所以在导入功能安全时暴露了当前存在的问题

    • 功能安全流程涉及的管理职责,可以由现有的角色比如项目经理、质量工程师等兼任,大家各自负责一部分,这样每个人增加的工作量就比较容易让人接受

     

     

    这么看下来的话,导入功能安全的成本其实也没有那么高了,对吧?所以,很多企业实施功能安全的成本特别高昂,很大程度上是因为第一次搞,而且在搞功能安全之前的研发流程、软件工具等基础设施并不完善。基础差、底子薄,却要一下子来个“三级跳”,感觉吃不消其实很正常。

     

    所以笔者认为,企业首先需要真正做到ISO 26262标准里要求的QM,然后在这个基础上再导入功能安全,这是最理想的情况。在这种从QM到ASIL的发展模式下,增加的成本仍然会有,但绝不会像现在这样让人难以接受。

     

    Image

     

    罗马不是一天建成的,基础设施的建设也需要持续投入,在此我们也就不再过多讨论了。作为一名功能安全工程师,我们首先要做的、并且肯定能做的就是在项目实施的过程中,想方设法用最低的成本来实现功能安全的要求。把功能安全做出来没有什么了不起的,我们的目标是要用最低的成本做出来。如果能做到这一点,那就意味着我们的产品相比同行友商而言,已经有了竞争优势。

     

    3.5 案例分享

     

    给大家分享一个笔者在实际项目中遇到的案例。要实现ASIL C的电流采样功能,我们可以使用两个Hall传感器来进行冗余比较,但是这样成本太高。然后我们可以使用一个Hall传感器+一个分流器来进行冗余比较,这样能降低成本。接下来我们还可以使用两个分流器来进行冗余比较,进一步降低成本。

     

    Image

     

    然而这样就结束了吗?并不是,实际上我们可以采用一个分流器来实现ASIL C的电流采样功能。安全目标没有变,但我们的设计成本在不断降低。

     

    Image

    3.6 实施建议

     

    我们的目标是用最低的成本实现功能安全的要求。要做到这一点,我们必须密切关注行业发展动向,因为整个行业都在追求降本,更低成本的方案/设计/芯片在不断的面世。如果有一种物美价廉的新技术,同时又能满足我们的需求,我们为什么不采用呢?另一方面,我们需要对功能安全深入理解,达到灵活运用的水平。这样的话,当新的技术方案摆在你面前的时候,你才能够判断出它是否可以满足功能安全的要求。这一点将在“理论与实践”部分再与大家详细讨论。

    原文连接:

    https://mp.weixin.qq.com/s?__biz=MjM5NDY4NjYwMA==&mid=2649477543&idx=1&sn=e3c622e121758fe2c4a74e051783e344&chksm=be9c824089eb0b564c3ead946522e99171694ffd8ae9f348d941df2623aa0b5e919ac8c3b0c7&&xtrack=1&scene=90&subscene=93&sessionid=1611652148&clicktime=1611652798&enterid=1611652798#rd

    展开全文
  • 在这个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。...
  • 原标题:职称就像是一座大山,相同教龄不同职称的教师退休工资相差多少?职称就像是一座大山,压得广大奋战在一线的教师喘不过气来,评职称无望,等他们到了退休的时候,能领到的退休金也是极其有限的。教师退休工资...
  • 北日耳曼语支(或斯堪的纳维亚语支)包括丹麦语、挪威语、瑞典语,冰岛语由于长期与大陆隔绝,较多地保留了古诺斯语的特点。与之接近的是法罗语(Faroese)。同属斯堪的纳维亚国家的还有芬兰,但芬兰语不属于印欧语...
  • 基本类型) object (引用类型,包含 function、[ ]、{ }) 基本类型的特点:直接存储在栈(stack)内存中的数据 引用类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆(heap)内存中 3. ⚡️深拷贝和浅拷贝 ...
  • Redis学习笔记(敖丙年面经)

    千次阅读 2022-04-11 20:10:13
    这些异常场景主要包括三大块,这也是分布式系统会遇到的三座大山:NPC。 N:Network Delay,网络延迟 P:Process Pause,进程暂停(GC) C:Clock Drift,时钟漂移 到这里我们再小结一下,基于 Redis 的实现分布式...
  • 同时还了解了 MQ 的特点:先进先出、发布和订阅的模式、持久化、分布式和消息确认等;接着讲了 MQ 引入对系统可能带来的风险;最后讲了 MQ 在使用时需要注意的问题。希望本课时对你整体了解 MQ 系统有所帮助。 ...
  • 面:HR面 HR的问题都是基于公司最基本的利益出发的,所以会给大家抛出几大深坑问题: 1、个人的职业规划是什么 2、你遇到的最大问题或者是困难是什么 3、你如何看待阿里 4、你能为阿里带来什么 5、你的优缺点是...
  • 如何优化MySQL千万级大表,我写了6000字的解读

    万次阅读 多人点赞 2019-10-21 20:03:03
    其实不难理解,我们要支撑的表数据量是千万级别,相对来说是比较大了,DBA要维护的表肯定不止一张,如何能够更好的管理,同时在业务发展中能够支撑扩展,同时保证性能,这是摆在我们面前的几座大山。 我们分别来说...
  • 它们的特点如下: 粒度 字 词 词表大小 固定 无法穷尽 未识别词(OOV) 没有 典型问题,长尾、稀疏性 参数/计算量 多 Token 变少,参数少,计算快 语义/建模复杂度 有不确定性 携带语义,能够降低不确定性 注:OOV=...
  • 经济发展、交通先行,尤其是当“智慧交通”列入“十三”交通运输重点规划之后,各地政府在交通智慧化互联互通、便捷出行等领域持续发力,不断推向纵深。大部分曾因“停车难”衍生的城市交通难题,如交通拥堵、事故...
  • 我们在丹巴县的旅馆里吃完午饭以后,就前往“甲居”,这是当地藏族很有特点的 8 角楼,非常有特色。   山脚下的大渡河。 其中一幢甲居近景。   然后我们一人花了 5 块钱,进入一户甲...
  • 剖析群体特点,理解集体行为。对群体来说,个人利益很少能成为主要动机,而对独处的个人来说,那可是唯一的动机。群体的无意识行为取代了个体有意识的行为,群体不擅讲理,却善于行动。民族发生演化的主要原因,不是...
  • 德鲁克:管理自己

    2021-01-21 17:34:29
    同那些才华横溢的人一样,他也相信好的创意能够移动大山。但是,真正移山的是推土机,创意只不过是为推土机指引方向,让它知道该到何处掘土。这位企划人员必须意识到不是计划做好就大功告成,接下来还得找人执行计划...
  • 侯策:如何突破前端开发技术瓶颈

    千次阅读 2020-10-14 09:44:48
    阅读本部分之前,大家需要了解缓存策略、浏览器渲染的特点、JavaScript 异步单线程对性能的影响、网络传输知识等内容,同时也要具备一些实践经验,如用 Chrome devtool 分析火焰图、编写并运行出准确的benchmark等。...
  • 在剑桥大学的数学和理论物理系,他仁慈地“统治”着相对论小组,组里有来自九个国家的十名出类拔萃的研究生。他的办公室门上有一块小饰板,上面大不敬地写着:请安静,老板在睡觉。 没那回事儿。从上午九点到下午...
  • 信息差可能是认知、消息、资源等,你甚至可以理解就是搁在供给与需求的大山,挡住了彼此需要的人们。 当下信息革命的核心就是减少信息差,例如豆瓣,将对电影、书有共同品味的人汇集到一个平台,让影迷、书迷可以...
  • IT职场人生系列之 怎样面试
  • 心理学家格尔迪说:“男人较女人来讲,更具有冒险精神、探索精神、宽容精神、求知精神,这些特点,会淋漓尽致地体现在对孩子的教育上。” 比如,针对父亲的探索精神, “妈妈总是拉着小孩子的手, 而爸爸总是让小孩...
  • 将至半山,望见大顶直侵霄汉,果然好座大山。这洪太尉独自一个,行了一回,盘坡转径,揽葛攀藤。约莫走过了数个山头,三二里多路,看看脚酸腿软,正走不动,口里不说,肚里踌躇,心中想道:“我是朝廷贵官公子,在...
  • 不要把面试当作吹牛侃大山的过程。 不要把面试当作发牢骚的过程。 时刻记住面试心法,可以避免一切禁忌。 面试完成后,我们将会进入一个不属于我们的公司,并为之工作。我们应该全身心投入还是淡然处之...
  • 但在国内,没有大山挡着你的创业。你真的可以从互联网做起,打造一个新的品牌出来。国内连一个特别棒的美甲公司、特别大的理发店品牌都不太有,这些每一个可能,都是创业打造新垄断品牌的机会。 - 4 ...
  • 但考虑到国内的整个法律体制相对于全球其他国家,更具有集中的、自上而下的监管特点;具有不同职能部门之间可以实现更好协调的优势,我们乐观地判断,自动驾驶车辆上路合法性的监管文件有望尽快出台。最新的好消息是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,297
精华内容 518
热门标签
关键字:

五大山的特点