Java内存区域
Java内存区域一、 介绍Java在运行在JVM中会有一些区域,这些区域是负责在不同的内存中管理数据的,所以被称为运行时的数据区域。一般分为以下几个区域:
这些区域有的是一直存在,有的是随着用户线程启动和结束而建立和销毁。
首先先总览概况一些每个区域的作用:
方法区 : 各个线程之间共享的区域,存储一些已经加载的类型信息、常量、静态变量等。在Java 8及以后的版本中,方法区的概念被更改为元空间(Metaspace),其大小可以根据需要动态调整。
堆:在JVM管理中是最大的一块区域,目的就是存放对象实例和垃圾回收,JVM中用于存储所有对象实例和数组的内存区域。当程序创建一个对象或数组时,这些数据都会被分配到堆中。
虚拟机栈:是线程私有1的,存储每个线程的执行状态,包括方法调用、局部变量、操作数栈和方法返回地址(主要针对Java的字节码)
本地方法栈:和虚拟机栈非常类似,但是是为本地Native方法来服务的。
程序计数器:与绝大多数语言的计数器是一样的,是字节码的行号治时期,通过改变计数器的值来来选取吓一跳需要执行的字节码指令2
二、堆 在JVM内存管理模型中,堆是一个很重要的内存管 ...
HashTable
HashTable类型题目题目描述:给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = “a”, magazine = “b”输出:false
示例 2:
输入:ransomNote = “aa”, magazine = “ab” 输出:false 示例 3:
输入:ransomNote = “aa”, magazine = “aab” 输出:true
题目分析: 是一类*字符统计类题目,只要统计m里面的字符在r里面有没有,所以用数组维护一个hashtable就可以*(用ascii码来解决) key就是count数组标,value就是减去ascii码的数值,比较数值从而达到目的
123456789101112131415public class RansomNote ...
Java的GC机制
Java的GC机制目的
自动回收防止内存泄漏
提高效率
提高稳定性
一、需要解决的问题 GC机制从不是和Java一起问世的,而是通过了很长时间的发展终于找到了Java这个载体。在很早以前,Lisp语言的创始人开始思考垃圾回收,并且提出了三个问题:
哪些内存需要回收
什么时候需要回收
如何回收
二、 哪些内存需要回收? 在GC中,主要需要回收的是两个区域:Java堆和方法区。因为程序在运行时所需要的数据,存放的区域如:程序计数器、虚拟机栈、本地方法都是随线程生、随线程死。而我们的Java堆和方法区存放的数据需要动态的进行回收,因为我们不知道程序会创建多少对象,因为如果接口的实现类大不相同,并且不知道有些ifelse分支所需要的空间时多少,所以我们只有在运行过程中才能得知。所以这些内存是需要区回收的。
三、什么时候需要回收? 这个问题的答案很简单,就是正在存活的的对象不能被回收,已经“死去”(不可能再被任何途径使用的对象)的对象需要被回收。可是如何判断是否是正在存活的呢?在过去的发展中,有很多的算法来解决这个问题
引入计数法:这是一个经典的算法,在对象中添加一个引用计数器, ...
Java内存模型与线程
Java内存模型与线程为什么要并发:计算机的运算能力与速度远大于它的存储和通信子系统的速度,不希望计算机处于一个空闲状态等待I/O、网络通信、数据库访问上。衡量标准就是TPS(每秒事物的处理数)
Java虚拟机的内存模型主要为了方便的从内存中存取实例字段、静态字段和数组对象的元素等,定义了内存模型。但是最关键的是不包括局部变量和方法参数,因为这两个是线程私有的。
在JVM中内存主要分为主内存和工作内存,线程的工作内存保存了这个线程使用的变量的主内存副本,线程对变量的操作不能在主内存中进行
一般虚拟机会使工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要访问的是工作内存
缓存一致性考虑在不同的工作内存要同时操作主内存或者操作相同的数据的情况下,如何保证内存间一致交互呢?主要是有不同操作。这些操作基本上都是在JVM下保证原子的、不可再分的。具体操作如下:
lock:把主内存的一个变量标记为一条线程独占的状态。
unlock:把主内存的一个处于锁定状态的变量释放出来。
read:把主内存的变量值从主内存传输到线程的工作内存中。
load:把前面从read中拿到的主内存的变 ...
Activity生命周期与启动模式
Activity生命周期与启动模式Activity作为一个Android的基础知识,必须要熟悉的掌握它的各个阶段,才能去进行很好的开发。我希望在此篇自我学习的文章,不断反复重复强化Activity的基础知识。
概览Activity的生命周期主要是分为几个阶段:
(1)onCreate():Activity正在创建,加载资源如界面布局,初始化等。
(2)onStart():Activity正在启动,到达后台,Activity可见,但不可与用户交互(用户看不到)
(3)onResume():Activity已经可见,在前台开始活动
(4)onPause():Activity正在**停止,紧接着onStop()就会被调用,此时快速回到Activity时,onResume会调用。位于后台 **
(5)onStop():Activity即将停止,在此时返回原Activity将通过onRestart()到达onStart()
(6)onDestroy():Activity即将被销毁,最后一站,重量级的回收工作和资源释放会在这里实现
(7)onRestart():Activity从onStop()重 ...
自定义View
自定义view
定义
View是所有控件的基类:Button、Textview View是一种界面层空间的抽象,VIew与ViewGroup代表了控件和控件组 这意味着View本身可以是单个控件也可以是由多个控件组成的一个控件组,这种结构就形成了一种View树的结构 类似于前端的DOM树
View的层级结构
Object-View-TextView-TestButton
View的位置参数
VIew的位置主要是由四个顶点的位置来决定的:top(左上角纵坐标)、left(左上角横坐标)、right(右下角横坐标)、bottom(右下角纵坐标)(这都是一种相对坐标)
VIew的宽高和坐标关系:
width=right-left height=bottom-top
利用Left=getLeft(); Right=getRight(); Top=getTop; Bottom=getBottom().
从Android3.0开始,View新增了X,Y,translationXhetranslationY
XY是左上角的图 ...
依赖注入框架
依赖注入框架在我们开发的过程中,我们会遇到一些依赖注入框架,所以总结一下:
Dagger2、koin、Hilt。其中现在用的多的是koin和Dagger2。但是由于Dagger2上手有难度,所以官方推出了Jetpack Hilt来代替Dagger2,所以现在主修koin和Hilt是可以的。
什么是依赖注入?为什么要依赖注入?首先要明确什么是依赖?对Android而言,这只是一个名词,具体一点就是一个类的里面变量就是类的依赖,就称为类依赖于变量。所谓依赖注入就是内部的类的变量不由开发者来定义,而是由外部去引入注入。
依赖注入可以自动加载依赖,使用一个模块但不依赖这个模块的具体实现。并且实现了一个数据共享的一个机制。如果不需要共享的数据使用依赖注入可以使它更加的简洁,在加载的过程中可以免去初始化加载的过程,提高效率。
怎么进行依赖注入?HiltDagger2Dagger2是一个依赖注入框架,官方维护的一个依赖注入框架。
https://github.com/google/dagger/releases
依赖注入是指所需要的事物是由注入来取代依赖。
在这里将依赖由注入传递给调用方。这里的依赖 ...
数据库概览
数据库技术
数据库及有关概念
数据模型
关系数据库
关系代数
SQL查询等语句
SQL中增删改查数据
设计数据库
数据库及有关概念
数据库所经历阶段
数据库特点
内部体系
外部体系
三个世界
实体型之间联系
人工管理阶段
主要用于计算,没有磁盘之类的直接存储设别。
数据不保存,计算完成即释放。
没有专门管理数据的软件。
数据不能共享,数据面向程序。
数据不具有独立性。依赖于应用程序
文件系统阶段
用于科学计算和信息管理。
有磁盘,磁鼓等直接存储设备。
出现文件系统:专门管理数据的软件
反复利用,增删改查。
有一定的共享性
但仍然是面向应用的,文件之间相互独立。缺乏联系
数据库系统阶段
出现大容量、存储快速的磁盘。
实现了数据结构化,面向全组织的所有应用
共享性高、冗余度低:一组数据集合可以为多个应用和多个用户使用
DBNS:数据库管理系统来实现各个应用程序对数据库中的数据共享
独立性高。
下面重点介绍数据库系统阶段。
数据库系统的特点
数据库结构
数据独立性
安全性控制
完整性控制
并发控制
数据库结构
数据库结构是指:用户的逻辑结构、数据库逻辑结构和物理结构。
数据独立 ...
链表题
奇偶链表:
题目重述:将一个链表的编号奇偶的放在一起,使用原地算法。(不能开辟空间,在原链表操作)
难点:如何保持相对顺序的情况下一起移动链表的结点。
解决办法:将奇链表放在一个节点里,偶链表放在一个节点里。(定义双指针引用)
定义一个evenhead链表引用,始终保持=even,所以最后就有
1234567891011ListNode even = head.hext;ListNode odd = head;ListNode evenhead = even;while(even!==null&&even.next==null){ odd.next=even.next;//覆盖偶数节点(第一步) odd=odd.next;//让奇数节点往后走一步 event.next=odd.next;//跳过中间的奇数节点 event=event.next;//让偶数节点往后走一步}odd.next=evenhead;//连接起来return odd;//伪代码
分割链表
题目重述:给定一个链表和一个x,将链表元素小 ...
小的想法
如何自律的完成某些事情多巴胺的工作模式 大脑产生快乐和痛苦产生的区域是重叠的,就像一个天平,当我们玩游戏、购物时,我们的天平会偏向快感,但在多巴胺的工作下,我们会在天平的另一端产生焦虑、烦躁的情绪。而且天平会偏向痛感的一边。
不经如此,多巴胺还掌控着我们的动力,不断追去快感的行为会让我们的行为变得困难,这就是多巴胺枯竭。
利用多巴胺追求轻微的痛感:当我们进行了轻微的痛感时,我们为了平衡天平,我们会产生一些快感多巴胺。例如:早上冲一分钟冷水澡,再去工作和学习,往往我们的注意力是非常集中的。相同的方法:运动健身、间歇性断食。所以痛感所产生的快乐不仅不会让我们焦虑,反而会缓解焦虑。
控制多巴胺释放的时间:过度的快感使我们的身体过度消耗多巴胺。据研究表明:咖啡、食物、巧克力、电子游戏、sex、尼古丁会从少到多的提高多巴胺释放,例如:早上我们可以喝一杯咖啡,午睡起来可以吃一块巧克力提高多巴胺释放。
降低消费期待:做任何事情都是有目的的,有期待的,当你期待过高,但又没有完成时,你总会自责与难过,当你玩游戏总会上头等。所以降低消费期待,是一个好办法。
延迟消费多巴胺:当你很想去做一个让你自责的事情 ...