前端学习第74天BS应用与Python内存管理

一.栅格系统

- 将所在父级的宽度等分为12等分
- 四种屏幕尺寸 col-xs- | col-sm- | col-md- | col-lg-
- 偏移 col-xs-offset- | ... | col-lg-offset-

```html
<div class="row">
    <div class="ele1 col-lg-4 col-xs-6"></div>
    <div class="ele2 col-lg-4 col-lg-offset-4 col-xs-6"></div>
</div>
<!-- 超大屏幕下: ele1占4等分 ele2与ele1间隔4等分,自己也占4等分 -->
<!-- 在超小,小,中等屏幕下, ele1与ele2均占6等分 -->
```
<head>
    <meta charset="UTF-8">
    <title>栅格系统</title>
    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
    <style>
        .row div {
            height: 60px;
        }
        .box {
            width: 800px;
            height: 60px;
            /*margin: 0 0000;*/
            background-color: black;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="row bg-pink">
            <!--栅格系统-->
            <!--1.将父级的width等分为12等分, 子级占父级宽度的多少等分-->
            <!--2.子级们的总占比不要超过12等分-->
            <!--3.在12等分内,子级同行显示-->
            <div class="bg-danger col-md-4"></div>
            <div class="bg-info col-md-9"></div>
        </div>
        <div class="row box bg-warning">
            <!--4.总占比小于12等分,偏移通过col-?-offset-?来偏移-->
            <!--5.设置一个平面宽度下的栅格, 大于该屏幕尺寸,可以运用此套css
            小于该屏幕尺寸,不适用, 但可以接着设置更小屏幕尺寸的栅格-->
            <div class="bg-danger col-md-4 col-sm-6 col-xs-10"></div>
            <div class="bg-info col-md-7 col-md-offset-1 col-sm-6 col-xs-12"></div>
        </div>
    </div>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script src="bootstrap-3.3.7-dist/js/bootstrap.js"></script>
</html>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>案例</title>
    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
    <style>
        .row {
            /*background-color: yellow;*/
        }
        .box {
            height: 60px;
            /*margin: 0 -15px;*/
        }
        .left {
            margin-right: 25px;
        }
        .right {
            margin-left: 25px;
        }
    </style>
</head>
<body>
<!--需求1-->
<!--两个盒子之间间距为30px-->
<div class="container">
    <div class="row">
        <div class="container col-md-6">
            <div class="box bg-warning"></div>
        </div>
        <div class="container col-md-6">
            <div class="box bg-danger"></div>
        </div>
    </div>
</div>
<!--两个盒子之间间距50px, 且左右没有留白-->
<div class="container">
    <div class="row">
        <div class="col-md-6">
            <div class="row">
                <div class="box bg-warning left"></div>
            </div>
        </div>
        <div class="col-md-6">
            <div class="row">
                <div class="box bg-danger right"></div>
            </div>
        </div>
    </div>
</div>
<!--重点: 在任何结构下, 需要容器就可以设置容器来嵌套显示内容,
需要row来配个容器布局,就可以在容器内部设置row-->
</body>

二.移动端屏幕适配

```html
<meta name="viewport" content="width=device-width, user-scaleable=no" />
<!-- 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>移动端适配</title>
    <!--注: 当页面没有适配移动端设备-->
    <!--注; 移动端设备不再以屏幕像素px作为布局宽度, 以屏幕像素点作为屏幕布局宽度-->
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <!--<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">-->

    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">

    <style>
        .row.bg-pink {
            height: 60px;
            width: 375px;
        }
    </style>
</head>
<body>
<div class="container-fluid">
    <nav class="navbar navbar-inverse">
        <div class="container-fluid">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                        data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Brand</a>
            </div>

            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
                    <li><a href="#">Link</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                           aria-expanded="false">Dropdown <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">Action</a></li>
                            <li><a href="#">Another action</a></li>
                            <li><a href="#">Something else here</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">Separated link</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">One more separated link</a></li>
                        </ul>
                    </li>
                </ul>
                <form class="navbar-form navbar-left">
                    <div class="form-group">
                        <input type="text" class="form-control" placeholder="Search">
                    </div>
                    <button type="submit" class="btn btn-default">Submit</button>
                </form>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#">Link</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                           aria-expanded="false">Dropdown <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">Action</a></li>
                            <li><a href="#">Another action</a></li>
                            <li><a href="#">Something else here</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">Separated link</a></li>
                        </ul>
                    </li>
                </ul>
            </div><!-- /.navbar-collapse -->
        </div><!-- /.container-fluid -->
    </nav>
</div>
<div class="container">
    <div class="row bg-pink">

    </div>
</div>
</body>

三.组件

1.表格

- 表格

```html
<!--striped条纹 bordered边框 hover悬浮-->
<table class="table table-striped table-bordered table-hover">
    <tr style="text-align: center">
        <th>标题</th>
        <th>标题</th>
        <th>标题</th>
    </tr>
    <tr>
        <td>单元格</td>
        <td>单元格</td>
        <td>单元格</td>
    </tr>
    <!-- 颜色强调,整行tr 或 单元格 th|td -->
    <tr class="success">
        <td>单元格</td>
        <td>单元格</td>
        <td>单元格</td>
    </tr>
    <tr>
        <td>单元格</td>
        <td class="danger">单元格</td>
        <td>单元格</td>
    </tr>
    <tr>
        <td>单元格</td>
        <td class="info" colspan="2" style="text-align: center">单元格</td>
        <!--<td>单元格</td>-->
    </tr>
</table>
```

2.表单

```html
<form action="">
    <!-- 分行: form-group -->
    <div class="form-group">
        <!--label的for是关联匹配的input的id, 当label点击时会让input获取焦点-->
        <label for="usr">用户名:</label>
        <!-- form-control: bs控制 -->
        <input class="form-control" type="text" name="usr" id="usr">
    </div>
    <div class="form-group">
        <label for="pwd">密码:</label>
        <input class="form-control" type="password" name="pwd" id="pwd">
    </div>
    <div class="form-group checkbox">
        <!--复选框-->
        <label>
            <input type="checkbox" value="reading" name="sk">请阅读
        </label>
    </div>
</form>

<!-- 内联表单 -->
<form class="form-inline"></form>

<!-- label与input同行显示 -->
<form action="" class="form-horizontal">
    <div class="form-group has-warning">
        <label for="usr2" class="col-sm-2 control-label">用户名:</label>
        <div class="col-sm-10">
            <input type="text" class="form-control" name="usr2" id="usr2" placeholder="请输入用户名">
        </div>
    </div>
</form>
```

四.python的内存管理

# Python的垃圾回收机制
## 引子:
我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以当一个变量值没有关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是一个垃圾会被Python解释的垃圾回收机制自动回收。。。

## 一、什么是垃圾回收机制?
垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间

## 二、为什么要用垃圾回收机制?

1程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

## 三、垃圾回收机制原理分析

Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。

### 1、什么是引用计数?

引用计数就是:变量值被变量名关联的次数

如:name=‘jason‘   

变量值jason被关联了一个name,称之为引用计数为1![1544151982250](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1544151982250.png)

引用计数增加:

x=10    (此时,变量值10的引用计数为1)

y=x (此时,把x的内存地址给了y,此时,x,y都关联了10,所以变量值10的引用计数为2)

引用计数减少:

x=3(此时,x与10解除了关联,与3 建立了关联,变量10的引用计数为1)

del y(del的意思是解除变量名y与变量值10的关联关系,此时,变量10的引用计数为0)

这样变量值10的引用计数为0,其占用的内存地址就会被回收

### 2、引用计数扩展阅读?(折叠)
引用计数机制执行效率问题:变量值被关联次数的增加或减少,都会引发引用计数机制的执行,这存在明显的效率问题
如果说执行效率还仅仅是引用计数机制的一个软肋的话,那么很不幸,引用计数机制还存在着一个致命的弱点,即循环引用(也称交叉引用)。

```python
# 变量名l1指向列表1,变量名l2指向列表2,如下
>>> l1=[‘列表1中的第一个元素‘]  # 列表1被引用一次
>>> l2=[‘列表2中的第一个元素‘]  # 列表2被引用一次
>>> l1.append(l2)             # 把列表2追加到l1中作为第二个元素,列表2的引用计数为2
>>> l2.append(l1)             # 把列表1追加到l2中作为第二个元素,列表1的引用计数为2
# l1与l2
# l1 = [‘列表1中的第一个元素‘,列表2的内存地址]
# l2 = [‘列表2中的第一个元素‘,列表1的内存地址]
```
循环引用可以使一组对象的引用计数不为0,然而这些对象实际上并没有被任何外部对象所引用,它们之间只是相互引用。这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然后由于相互引用的存在,每一个对象的引用计数都不为0,因此这些对象所占用的内存永远不会被释放。比如:

```python
>>> l1
[‘列表1中的第一个元素‘, [‘列表2中的第一个元素‘, [...]]]
>>> l2
[‘列表2中的第一个元素‘, [‘列表1中的第一个元素‘, [...]]]
>>> l1[1][1][0]
‘列表1中的第一个元素‘

```

如果我们执行del l1,列表1的引用计数=2-1,即列表1不会被回收,同理del l2,列表2的引用计数=2-1,此时无论列表1还是列表2都没有任何名字关联,但是引用计数均不为0,所以循环引用是致命的,这与手动进行内存管理所产生的内存泄露毫无区别
要解决这个问题,Python引入了其他的垃圾收集机制来弥补引用计数的缺陷:1、“标记-清除” 2、“分代回收”

##### 标记-清除

容器对象(比如:list,set,dict,class,instance)都可以包含对其他对象的引用,所以都可能产生循环引用。而“标记-清除”计数就是为了解决循环引用的问题。

在了解标记清除算法前,我们需要明确一点,内存中有两块区域:堆区与栈区,在定义变量时,变量名存放于栈区,变量值存放于堆区,内存管理回收的则是堆区的内容,详解如下图

标记/清除算法的做法是当有效内存空间被耗尽的时候,就会停止整个程序,然后进行两项工作,第一项则是标记,第二项则是清除

 标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象。

 清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

GC roots对象直接访问到的对象,插图如下

GC roots对象间接访问到的对象,插图如下

用图形解释,环引用的例子中的l1与l2,在什么时候启动标记清除,标记清除的整个过程,插图

#### 分代回收

背景:

基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,这是非常消耗时间的,于是引入了分代回收来提高回收效率,采用“空间换时间的策略”。

什么是分代回收?

分代:

分代回收的核心思想是:在多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低,具体实现原理如下:

分代指的是根据存活时间来为变量划分不同等级(也就是不同的代)

新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低

回收:

回收依然是使用引用计数作为回收的依据

画图:

#### 缺点:

例如一个变量刚刚从新生代移入青春代,该变量的绑定关系就解除了,该变量应该被回收,青春代的扫描频率低于新生代,所以该变量的回收时间被延迟。

原文地址:https://www.cnblogs.com/ye-hui/p/10210777.html

时间: 2024-10-03 14:45:14

前端学习第74天BS应用与Python内存管理的相关文章

iOS学习第四天杂记--Objective-C中的内存管理

先说明下,原文为青玉伏案写的.我这只是学习而已. OC中的内存管理. OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现):当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现):当计数器为0时,该对象占用的内存空间会被收回.在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值. Tips:测试时

OC学习笔记 ARC 强指针和弱指针 内存管理

强调一些概念 类:是一种结构,它表示对象的类型,对象引用类来获取和本身有关的各种信息,特别是运行什么代码来处理每种操作. 对象:是一种结构,它包含值和指向其类的隐藏指针. 实例:对象的另一种称呼. 消息:是对象可以执行的操作,用于通知对象去做什么.对象接收消息后,将查询对应的类,以便查找正确的代码来运行. 方法:是为响应消息而运行的代码,根据对象的类,消息可以调用不同的方法. 接口:是对象的类应该提供特殊的特性的描述. 用法如:@property (attribute1,attribute2)

【cocos2d-x学习笔记】文本输入、菜单、内存管理、定时器

文本输入 CCTextFiledTTF CCTextFiledTTF *textEdit = CCTextFiledTTF::textFiledWithPlaceHolder("input", "Arial", 33); textEdit->atchWithIME();      弹出软键盘 textEdit->setSecureTextEntry(true);  密码格式输入 CCEditBox CCScale9Sprite *bg = CCScale

初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)

笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/31824179 转载请注明出处 假设认为文章对你有所帮助.请通过留言或关注微信公众帐号fengsh998来支持我,谢谢. Swift使用自己主动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不须要考虑内存的管理. 当实例并不再被须要时.ARC会自己主动释放这些实例所使用的内存. 另外须要注意的: 引用计数仅仅

cortex_m3_stm32嵌入式学习笔记(二十四):内存管理实验(动态内存)

有用过C语言编程的童鞋对动态管理内存肯定有点了解..好处就不多说了 今天实现STM32的动态内存管理 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 内存管理的实现方法有很多种,他们其实最终都是要实现两个函数:malloc 和 free(好熟悉): malloc 函数用于内存申请, free 函数用于内存释放. 实现方式:分块式内存管理 从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成.内存池被等

操作系统学习(一)、80x86保护模式内存管理

整理的不好,凑合着看吧 目录 1.内存及寻址 2.地址变换 3.分段机制 4.分页机制 5.保护 6.去到底部 一.内存及寻址 返回目录 二.地址变换 80X86 从 逻辑地址 到 物理地址 的转换:第一阶段是使用分段机制把程序的 逻辑地址变换成处理器可寻址的内存空间(称为线性地址空间)中的地址. 第二阶段使用分页机制把线性地址转换为物理地址. 在地址变换的过程中, 第一阶段的分段变换机制总是使用,第二阶段的分页机制是可选的,如果没有启用分页机制,那么分段机制产生的线性地址空间就直接映射到处理器

WEB前端学习笔记 一

最近时间比较充裕,整理了一下学习过的笔记,此篇笔记包含了:Html.Css.JavaScript.Jquery.以及使用帝国CMS或是织梦CMS建立自己的网站,也许也会整理一下PHP的笔记,如果时间允许会整理完全. 虽然笔记是从最基础的开始,但是,并不包含电脑的基础知识,所以你必须已经掌握了一些电脑的基本操作,比如开关机,你的电脑用的是什么操作系统,至少也要会用word和wps吧.浏览器是做什么的,什么拷贝.复制.粘贴.知道最基本的文件类型,如,文本文件,视频文件,图片文件,什么是可执行文件,分

【转载】前端学习路径

前端学习路径 什么是前端工程师? 总而言之前端工程师就是运用HTML/CSS/JavaScript等Web技术,在工作中配合设计师实现用户界面,和后端工程师进行数据对接,完成Web应用开发的职位. 开发工具 设计软件 前端工程师最首要的任务就是把设计师的设计图切好并翻译成代码,所以我们要学习一些设计软件的基础操作和切图方法. Photoshop 运用最广泛的设计软件,大部分人都在用它,很有必要学习一下 前端工程师必备的PS技能——切图篇 Sketch 轻量且功能强大,切图迅速高效,为UI设计而生

前端学习

TOP:前端学习==20%知识+80%能力 1.好教材 JS CSS javascript高级程序设计 精通CSS                                                    DOM编程艺术 CSS权威指南         2.练习 (1)教材代码*3 (2)FreeCodeCamp (3)计蒜客 (4)在线编程online--{MDN,W3Cschool} 3.工具栈 (1)Sublime Text插件--{1.Emmet--chart;  2.侧边栏