Life is much easier if you post complete compilable code. Then readers can replicate your problem and suggest a solution.
If you want to post only snippets, you should strip everything down to the minimal statements that illustrate your question. Readers will not build your snippet. They might spot the answer by inspection.
Programs are easier to maintain if you use local variables. Return values from functions. Only use global variables when appropriate.
David.
I built both the U8G and the U8G2 projects for a Uno:
U8G was 20134 Flash + 615 bytes SRAM (30%)
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //Defining OLED Specs
U8G2 was 24526 Flash + 1863 bytes SRAM (90%)
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
Your SRAM usage is dangerous. Especially if you use the String class.
If you change your constructor to a "non-Full Buffer" version e.g.:
U8G2 was 24524 Flash + 967 bytes SRAM (47%)
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
You should end up with similar performance as the U8G version.
David.
The 2 constructor has a bigger buffer than the 1 constructor. Display will print a little faster.
Regarding RAM/Flash consumption: The problem is partly caused by Arduino Wire lib which is used in U8g2. For AVR Architectures old U8glib came with specific I2C procedures for ATMega, but I gave up maintaining any uC specific code.
Oliver