JMODEM uses variable-length records called blocks. These blocks start with 512 data-bytes and increase in length to a maximum of 8192 bytes per block. There is a 6-byte overhead associated with each block so the percentage of overhead starts at a fairly high 1.1 percent and decreases to a very low 0.07 percent as the transmission progresses. The block length will increase in 512-byte increments as long as there are no errors requiring retransmission. Should an error occur, the block-size is cut in half. This continues until the block-size is as short as 64 bytes.
JMODEM also included a basic RLEdata compression system, which replaces strings of repeated characters with a counter. If a string of many similar characters are found, JMODEM sends a "sentinel byte" (hexadecimal 0xBB) followed by a two-byte number, followed by the byte to be repeated. JMODEM applied RLE on a block-by-block basis, as opposed to the file as a whole. Since many files were already compressed with systems like .zip, JMODEM only used RLE on blocks where it actually reduced the size of the block.
JMODEM is explained in some detail in the John Dvorak book Dvorak's Guide to PC Telecommunications.