基于Android开发的登录注册页面(附带学习源码)

2023-11-06

注册&登录,是每个产品设计中最基本,最重要同时也是最繁琐的一环。看似简单,却与相当多的产品功能用户使用场景交织在一起,受到产品类型、用户定位、业务逻辑、使用场景、用户操作等不同因素影响。绝大多数的网站已经放弃了复杂、繁复的注册流程,将用户可能会遭遇障碍、引起用户反感和烦躁的部分去除,尽可能简单的让用户完成注册和登录流程。当用户完成注册之后,可以选择性地提供额外的信息,而这些信息可能会给给用户带来更加定制化的用户体验。

登录注册页面文件:url80.ctfile.com/f/25127180-739207130-e196d4?p=551685 (访问密码: 551685)


之前文章根据《【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)》我们知道了如何进行设置和控制对应的堆内存和容器内存的之间的关系,所以防止JVM的堆内存超过了容器内存,导致容器出现OOMKilled的情况。但是在整个JVM进程体系而言,不仅仅只包含了Heap堆内存,其实还有其他相关的内存存储空间是需要我们考虑的,一边防止这些内存空间会造成我们的容器内存溢出的场景,正如下图所示。

接下来了我们需要进行分析出heap之外的一部分就是对外内存就是Off Heap Space,也就是Direct buffer memory堆外内存。主要通过的方式就是采用Unsafe方式进行申请内存,大多数场景也会通过Direct ByteBuffer方式进行获取。好废话不多说进入正题。

JVM参数MaxDirectMemorySize
我们先研究一下jvm的-XX:MaxDirectMemorySize,该参数指定了DirectByteBuffer能分配的空间的限额,如果没有显示指定这个参数启动jvm,默认值是xmx对应的值(低版本是减去幸存区的大小)。

DirectByteBuffer对象是一种典型的”冰山对象”,在堆中存在少量的泄露的对象,但其下面连接用堆外内存,这种情况容易造成内存的大量使用而得不到释放

highlighter- code-theme-dark
-XX:MaxDirectMemorySize
-XX:MaxDirectMemorySize=size 用于设置 New I/O (java.nio) direct-buffer allocations 的最大大小,size 的单位可以使用 k/K、m/M、g/G;如果没有设置该参数则默认值为 0,意味着JVM自己自动给NIO direct-buffer allocations选择最大大小。

-XX:MaxDirectMemorySize的默认值是什么?
在sun.misc.VM中,它是Runtime.getRuntime.maxMemory(),这就是使用-Xmx配置的内容。而对应的JVM参数如何传递给JVM底层的呢?主要通过的是hotspot/share/prims/jvm.cpp。我们来看一下jvm.cpp的JVM源码来分一下。

c
// Convert the -XX:MaxDirectMemorySize= command line flag
// to the sun.nio.MaxDirectMemorySize property.
// Do this after setting user properties to prevent people
// from setting the value with a -D option, as requested.
// Leave empty if not supplied
if (!FLAG_IS_DEFAULT(MaxDirectMemorySize)) {
char as_chars[256];
jio_snprintf(as_chars, sizeof(as_chars), JULONG_FORMAT, MaxDirectMemorySize);
Handle key_str = java_lang_String::create_from_platform_dependent_str(“sun.nio.MaxDirectMemorySize”, CHECK_NULL);
Handle value_str = java_lang_String::create_from_platform_dependent_str(as_chars, CHECK_NULL);
result_h->obj_at_put(ndx * 2, key_str());
result_h->obj_at_put(ndx * 2 + 1, value_str());
ndx++;
}
jvm.cpp 里头有一段代码用于把 - XX:MaxDirectMemorySize 命令参数转换为 key 为 sun.nio.MaxDirectMemorySize的属性。我们可以看出来他转换为了该属性之后,进行设置和初始化直接内存的配置。针对于直接内存的核心类就在http://www.docjar.com/html/api/sun/misc/VM.java.html。大家有兴趣可以看一下对应的视线。在JVM源码里面的目录是:java.base/jdk/internal/misc/VM.java,我们看一下该类关于直接内存的重点部分。

java
public class VM {

// the init level when the VM is fully initialized
private static final int JAVA_LANG_SYSTEM_INITED     = 1;
private static final int MODULE_SYSTEM_INITED        = 2;
private static final int SYSTEM_LOADER_INITIALIZING  = 3;
private static final int SYSTEM_BOOTED               = 4;
private static final int SYSTEM_SHUTDOWN             = 5;


// 0, 1, 2, ...
private static volatile int initLevel;
private static final Object lock = new Object();

//......

// A user-settable upper limit on the maximum amount of allocatable direct
// buffer memory.  This value may be changed during VM initialization if
// "java" is launched with "-XX:MaxDirectMemorySize=<size>".
//
// The initial value of this field is arbitrary; during JRE initialization
// it will be reset to the value specified on the command line, if any,
// otherwise to Runtime.getRuntime().maxMemory().
//
private static long directMemory = 64 * 1024 * 1024;

上面可以看出来64MB最初是任意设置的。在-XX:MaxDirectMemorySize 是用来配置NIO direct memory上限用的VM参数。可以看一下JVM的这行代码。

highlighter- code-theme-dark Bash
product(intx, MaxDirectMemorySize, -1,
“Maximum total size of NIO direct-buffer allocations”)
但如果不配置它的话,direct memory默认最多能申请多少内存呢?这个参数默认值是-1,显然不是一个“有效值”。所以真正的默认值肯定是从别的地方来的。

java

// Returns the maximum amount of allocatable direct buffer memory.
// The directMemory variable is initialized during system initialization
// in the saveAndRemoveProperties method.
//
public static long maxDirectMemory() {
    return directMemory;
}

//......

// Save a private copy of the system properties and remove
// the system properties that are not intended for public access.
//
// This method can only be invoked during system initialization.
public static void saveProperties(Map<String, String> props) {
    if (initLevel() != 0)
        throw new IllegalStateException("Wrong init level");

    // only main thread is running at this time, so savedProps and
    // its content will be correctly published to threads started later
    if (savedProps == null) {
        savedProps = props;
    }

    // Set the maximum amount of direct memory.  This value is controlled
    // by the vm option -XX:MaxDirectMemorySize=<size>.
    // The maximum amount of allocatable direct buffer memory (in bytes)
    // from the system property sun.nio.MaxDirectMemorySize set by the VM.
    // If not set or set to -1, the max memory will be used
    // The system property will be removed.
    String s = props.get("sun.nio.MaxDirectMemorySize");
    if (s == null || s.isEmpty() || s.equals("-1")) {
        // -XX:MaxDirectMemorySize not given, take default
        directMemory = Runtime.getRuntime().maxMemory();
    } else {
        long l = Long.parseLong(s);
        if (l > -1)
            directMemory = l;
    }
    // Check if direct buffers should be page aligned
    s = props.get("sun.nio.PageAlignDirectMemory");
    if ("true".equals(s))
        pageAlignDirectMemory = true;
}
//......

}
从上面的源码可以读取 sun.nio.MaxDirectMemorySize 属性,如果为 null 或者是空或者是 - 1,那么则设置为 Runtime.getRuntime ().maxMemory ();如果有设置 MaxDirectMemorySize 且值大于 - 1,那么使用该值作为 directMemory 的值;而 VM 的 maxDirectMemory 方法则返回的是 directMemory 的值。

因为当MaxDirectMemorySize参数没被显式设置时它的值就是-1,在Java类库初始化时maxDirectMemory()被java.lang.System的静态构造器调用,走的路径就是这条:

java
if (s.equals(“-1”)) {
// -XX:MaxDirectMemorySize not given, take default
directMemory = Runtime.getRuntime().maxMemory();
}
而Runtime.maxMemory()在HotSpot VM里的实现是:

highlighter- code-theme-dark Bash
JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))
JVMWrapper(“JVM_MaxMemory”);
size_t n = Universe::heap()->max_capacity();
return convert_size_t_to_jlong(n);
JVM_END
这个max_capacity()实际返回的是 -Xmx减去一个survivor space的预留大小。

结论分析说明
MaxDirectMemorySize没显式配置的时候,NIO direct memory可申请的空间的上限就是-Xmx减去一个survivor space的预留大小。例如如果您不配置-XX:MaxDirectMemorySize并配置-Xmx5g,则"默认" MaxDirectMemorySize也将是5GB-survivor space区,并且应用程序的总堆+直接内存使用量可能会增长到5 + 5 = 10 Gb 。

其他获取 maxDirectMemory 的值的API方法
BufferPoolMXBean 及 JavaNioAccess.BufferPool (通过SharedSecrets获取) 的 getMemoryUsed 可以获取 direct memory 的大小;其中 java9 模块化之后,SharedSecrets 从原来的 sun.misc.SharedSecrets 变更到 java.base 模块下的 jdk.internal.access.SharedSecrets;要使用 --add-exports java.base/jdk.internal.access=ALL-UNNAMED 将其导出到 UNNAMED,这样才可以运行

java
public BufferPoolMXBean getDirectBufferPoolMBean(){
return ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class)
.stream()
.filter(e -> e.getName().equals(“direct”))
.findFirst()
.orElseThrow();
}
public JavaNioAccess.BufferPool getNioBufferPool(){
return SharedSecrets.getJavaNioAccess().getDirectBufferPool();
}
内存分析问题
-XX:+DisableExplicitGC 与 NIO的direct memory
用了-XX:+DisableExplicitGC参数后,System.gc()的调用就会变成一个空调用,完全不会触发任何GC(但是“函数调用”本身的开销还是存在的哦~)。

做ygc的时候会将新生代里的不可达的DirectByteBuffer对象及其堆外内存回收了,但是无法对old里的DirectByteBuffer对象及其堆外内存进行回收,这也是我们通常碰到的最大的问题,如果有大量的DirectByteBuffer对象移到了old,但是又一直没有做cms gc或者full gc,而只进行ygc,那么我们的物理内存可能被慢慢耗光,但是我们还不知道发生了什么,因为heap明明剩余的内存还很多(前提是我们禁用了System.gc)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Android开发的登录注册页面(附带学习源码) 的相关文章

  • 您的应用中的 Google Analytics SDK

    我按照这里的说明进行操作 https developers google com analytics devguides collection android v3 https developers google com analytics
  • Kotlin Android Firebase 数据库哈希映射转换为类

    我正在尝试从 firebase 数据库获取数据 断点显示它正在获取数据 但看起来我没有正确地将其分配给我的班级 这会导致此异常 java lang ClassCastException 无法将 java util HashMap 转换为 班
  • Android Widget ID 是否持久

    在从桌面删除该 Widget 实例之前 您从操作系统收到的用户桌面上特定 Widget 实例的 Widget ID 是否一致 我找不到任何明确说明这一点的文档 但我假设这是因为文档说您可以使用小部件 id 来存储任何实例配置信息 我想将一些
  • 在 Android 中使用 awt

    我有一个绘制图表的 Java Swing 应用程序 它使用 Graphics2D 调用和 awt 对象 例如 Rectangle 等 在某些时候我可能想将其移植到 Android 上 我知道我无法在 Android 上使用 Graphics
  • android:ScrollView(或视差)内的RecyclerView

    我有一个片段2 次卡片浏览内有多个控件 below我有第二个卡片视图回收者视图 这有效perfect 问题是 recyclerview 启动了屏幕的最底部 并且滚动recyclerview非常small 以前使用过列表视图 这使我可以适应您
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • 如何在 Android 中创建始终位于顶部的全屏覆盖 Activity

    我希望能够创建一个始终位于 Android 显示前面的 Activity 它不应该接收任何输入 只需将其传递到其下面的任何应用程序即可 像平视显示器之类的东西 我能够研究我需要将底层窗口类型设置为 TYPE SYSTEM ALERT 但看起
  • 使用 RoboSpice 有没有办法从异常中获取 HTTP 错误代码?

    我正在编写一个使用 RoboSpice 的应用程序 在请求侦听器 onRequestFailure SpiceException arg0 中 有没有办法确定该错误是由于发生 401 HTTP 错误而导致的 我有一个后端服务 当令牌过期时
  • 使用 START_STICKY 启动时服务进程被终止后的 onStartCommand

    我一直在阅读 Android 文档 我想知道是否有人可以阐明当以 START STICKY 启动的服务的进程被终止时服务实例会发生什么情况 我假设本地状态数据 实例变量 也丢失了 Android 在重新创建服务时是否会采取任何措施来帮助重新
  • 在 Android 中使用 AES 加密的最佳实践是什么?

    我为什么问这个问题 我知道人们对 AES 加密存在很多疑问 即使对于 Android 也是如此 如果您在网络上搜索 会发现很多代码片段 但在每个页面上 在每个 Stack Overflow 问题中 我都发现了另一个具有重大差异的实现 所以我
  • 添加 play-services-maps 依赖项自动添加 glEsVersion 2.0 要求

    我想融入Google Play Services Maps module 由于地图清单声明
  • 如何防止应用程序被盗(针对Android应用程序)?

    我想知道防止人们窃取我的应用程序的最有效方法是什么 在线下载 apk 的副本而不是购买它 我已经花了一个lot特别是 Droidbox 上的时间 并且不会发布 Sync 直到我可以保证提供专业版本的非法副本的人无法发布 有人实施过这个吗 我
  • 本地管理的广播接收器泄漏?

    当应用程序被系统杀死时 本地 即使用 LocalBroadcastManager 管理 BroadcastReceiver 是否有可能泄漏 我需要它的具体用例是我想在活动的 onCreate onDestroy 中注册 注销 Broadca
  • foo.setVisibility(View.GONE) 和parent.removeView(foo) 之间的区别

    如果 foo 是一个视图 那么有什么区别foo setVisibility View GONE and fooParent removeView foo 我对两个语句之前和之后视图的内存消耗特别感兴趣 可见性设置为 GONE 的视图是否会消
  • 如何在Room的数据库迁移中正确添加索引?

    我在迁移 Room 数据库时遇到问题 在更新的数据库中 我必须将一个字段从整数更改为双精度值 我读到它并不像听起来那么容易 为了做到这一点 我必须使用这个更改后的属性创建新的临时表 复制前一个表中的所有值 删除旧的值 最后重命名临时表 我的
  • 使用 twitter API 1.1 在 Android 应用程序中显示 twitter feed

    基本上我想展示这个提要 https en twitter com epl live https en twitter com epl live在我的应用程序中 由于 twitter 更改了其 api 1 1 每个调用都必须经过授权 我发现的
  • DialogFragment 关闭事件

    我需要处理 DialogFragment 的结尾 在调用 dismiss 之后 例如 我会在关闭后 包含 片段的活动内显示一个 toast 我该如何处理该事件 覆盖onDismiss 在你的DialogFragment中 或者使用setOn
  • android - 如何让按钮每次按下时单击播放声音文件?

    我打开了一个新项目 现在我想做的是 通过按下按钮 我想要播放一个 mp3 文件 而且每次按下按钮时 声音文件都会再次从头开始播放 所以假设 mp3 长 10 秒 我按下按钮 它正在播放 4 秒后我再次按下按钮 声音将再次播放 现在我想知道的
  • 致命异常:GoogleApiHandler

    在我的项目中 我使用货币化服务 Vungle AppLovin 当我尝试加载广告时 出现此异常 E AndroidRuntime 致命异常 GoogleApiHandler 进程 kz ikar PID 3673 java lang NoS
  • android.view.WindowLeaked - 使用对话框和新意图时

    我已经尝试了 stackoverflow 上提供的所有可能的解决方案 但我仍然在 logcat 中遇到此错误 活动 com xyz MainActivity 泄露了最初在此处添加的窗口 com android internal policy

随机推荐

  • python实战:read,write读写,json文件读写

    1 read write 读写文本文件 基本操作 一 件的种类 1 本 件 可以使 本编辑软件查看 例如 python 的源程序 txt 文本文件等 2 二进制 件 保存的内容不是给 直接阅读的 是提供给其他软件使 的 例如 图 件 频 件
  • 前端学习——02——js预编译过程详解易懂附代码

    目录 一 预编译前奏 二 函数体系内的预编译 三 全局的预编译 四 例题 赋值一定是自右向左的 所以是先把123赋给b 再把b赋给a b是未经声明的 所以全局能访问到b a是局部变量所以访问不到 二 函数体系内的预编译 函数执行的前一刻生成
  • 网络虚拟化技术与NFV

    一 虚拟化技术概述 1 虚拟化技术简介 虚拟化 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机可运行不同的操作系统 并且应用程序都可以在相互独立的空间内运行而互不影响 从而显著提高计
  • gcd模板

    include
  • 如何把数据集划分成训练集和测试集

    本文主要内容来自周志华 机器学习 本文中代码 问题 对于一个只包含 m 个样例的数据集 D x 1 y 1 x 2 y 2 cdots x m y m 如何适当处理 从 D 中产生训练集 S 和测试集 T 下面介绍三种常见的做法 留出法 交
  • 中兴网络设备交换机路由器检查调试信息是否关闭命令方法

    描述 中兴网络设备交换机路由器检查调试信息是否关闭命令方法 命令 show debug
  • 图像处理和计算机视觉中的经典论文

    感谢水木上同领域的同学分享 有了他的整理 让我很方便的获得了CV方面相关的经典论文 我也顺便整理一下 把pdf中的文字贴到网页上 方便其它人更直观的获取所要内容 资料的下载链接为 http iask sina com cn u 225229
  • Java SE和 Java EE有什么区别

    Java SE是 Java 语言的标准版本 用于开发桌面应用程序 小型嵌入式系统和服务器端应用程序 Java EE是 Java 语言专为企业应用程序而设计的版本 提供了更多的功能和服务 如 Web 技术 安全性和事务管理
  • ThinkPHP表单验证规则归纳总结

    格式验证类 require isRequire 不得为空 number isNumber 验证字段是否为纯数字 integer isInteger 验证字段是否为整数 float isFloat 验证字段是否为浮点数 boolean isB
  • JSP相关学习-CSS

    一 CSS的定义 二 CSS的规则 在CSS样式表中包括3部分内容 选择符 属性和属性值 语法格式为 选择符 属性 属性值 选择符 HTML语言中的标记都是通过不同的CSS选择符进行控制的 属性 主要包括字体属性 文本属性 背景属性 布局属
  • 推荐一款程序员截图神器!

    快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器 几乎每一个程序员都会设置开机自启 因为这个截图功能太太太好用了 只要你在键盘上按下F1就可以轻松截取整个屏幕 然后再按下F3就可以在你的电脑屏幕上将图片贴在最顶
  • 前端常见官网地址总结

    前端面试题官网总结 前端面试题汇总 最全面试题总结 https www yuque com cuggz interview vgbphi 力扣官网 算法题官网总结 https leetcode cn problemset all web前端
  • input如何设置默认值

  • 镜像安装python3.7+pytorch1.7+torchvision0.8.1

    一 创建虚拟环境并安装3 7的python 1 打开Windows环境下的anaconda conda create n name python 3 7 你创建的虚拟环境文件可以在 Anaconda gt envs文件下找到 2 进入新建的
  • Mina 学习建议,仅供参考

    关于新手对Mina的学习 本人推荐的方法如下 一 先了解一下Java NIO 重点是了解Java NIO的设计理念以及重要的几个概念 二 了解一个Java NIO的现有框架 作个简单的对比 三 可以正式开始学习Mina了 先看一下官方对Mi
  • KEIL断点执行不到以及代码优化问题

    KEIL会在其内部进行代码设置优化 分别为0 1 2 3级 三级就是优化最高 但是实际使用遇到 打了断点却无法进入 在其函数内部出现断点停止运行 表明函数确实执行了 如上图 第二句话被划分到了DELAY里面 KEIL汇编与C语言没有对应好
  • YOLOX改进之一:添加CBAM、SE、ECA注意力机制

    前 言 之前发布系列已经有对2020年发布的YOLOv5进行改进 不少朋友咨询YOLOX改进方法 本系列就重点对YOLOX如何改进进行详细介绍 基本跟YOLOv5一致 有细微差异 此后的系列文章 将重点对YOLOX的如何改进进行详细的介绍
  • 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba"...

    答案 对于给定的字符串s 可以使用中心扩展算法来查找最长的回文子串 该算法从字符串的每个字符开始 然后向两边扩展 直到遇到不匹配的字符或到达字符串的边界 此外 也可以使用动态规划法来求解最长回文子串
  • 体育培训课程预约线上教学小程序制作开发

    客户公司是做体育培训的 想做一个有会员的课程预约 计算 一些线上课程的教学 主要是一些比如说线上课程的教学啊 然后我们线下课程的预约这些的问题 然后是比有一些比如说嗯 答疑呀 然后平时我们的比如说 比如说这个小程序 或者说推送 他有没有类似
  • 基于Android开发的登录注册页面(附带学习源码)

    注册 登录 是每个产品设计中最基本 最重要同时也是最繁琐的一环 看似简单 却与相当多的产品功能用户使用场景交织在一起 受到产品类型 用户定位 业务逻辑 使用场景 用户操作等不同因素影响 绝大多数的网站已经放弃了复杂 繁复的注册流程 将用户可